gpt4 book ai didi

python - django 模型中的 m2m 'through' 字段抛出此错误 : 'M2M field' object has no attribute '_m2m_reverse_name_cache'

转载 作者:行者123 更新时间:2023-12-04 07:41:13 31 4
gpt4 key购买 nike

嘿伙计们,我正在尝试添加一个 m2m through领域让我的“部门”模型的助手像 department.assistants.all() 一样打电话,但这样做时,我收到此错误 AttributeError: 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache' .
这是我的模型:

class Department(models.Model):
id = models.BigAutoField(primary_key=True)
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
assistants = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Assistants', related_name='dep_assistants',
symmetrical=False)

class Assistants(models.Model):
id = models.BigAutoField(primary_key=True)
department = models.ForeignKey(Department, related_name='of_department', on_delete=models.CASCADE)
assistant = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='dt_assistant',
verbose_name="Department Assistant", on_delete=models.CASCADE)
added = models.DateTimeField(auto_now_add=True)
我对这个概念很陌生。有人能告诉我我在这里做错了什么吗?
谢谢

最佳答案

您定义模型的方式查询似乎太困惑了。尝试在下面如何定义模型,然后尝试查询。
您没有在多对多字段定义中提及 through_field 属性。检查文档:https://docs.djangoproject.com/en/3.2/ref/models/fields/#django.db.models.ManyToManyField

class Department(models.Model):
# i think this is not needed. Also id is a protected keyword in python.
# id = models.BigAutoField(primary_key=True)
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
assistants = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Assistants',
related_name='departments', through_fields=("department", "assistant"))

# model name should never be prural. It is singluar becuase it is the name of the object.
class Assistant(models.Model):
# i think this is not needed. Also id is a protected keyword in python.
# id = models.BigAutoField(primary_key=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE)
assistant = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name="Department Assistant", on_delete=models.CASCADE)
added = models.DateTimeField(auto_now_add=True)


# how to query assistants from departments
# you will get objects of User model
qs = department.assistants.all()


# how to query departments from assistants
# you will get objects of Department model
qs = user.departments.all()


# If you want to query the Assistant model

# from department object
qs = department.assistant_set.all()

# from assistant object
qs = user.assistant_set.all()

# in either case you will get the objects of Assistant model
for i in qs:
print(i.added, i.department, i.assistant)

试试这个,如果你仍然收到错误,请告诉我。
我的建议是命名 assistant Assistant 模型上的字段为 user .这样你就不需要定义 through_field在多对多领域。

关于python - django 模型中的 m2m 'through' 字段抛出此错误 : 'M2M field' object has no attribute '_m2m_reverse_name_cache' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67455288/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com