Python m2m和x27;通过';django模型中的字段抛出此错误:';M2M字段';对象没有属性'_m2m#U反向#U名称#U缓存';

Python m2m和x27;通过';django模型中的字段抛出此错误:';M2M字段';对象没有属性'_m2m#U反向#U名称#U缓存';,python,django,django-models,django-rest-framework,django-views,Python,Django,Django Models,Django Rest Framework,Django Views,嘿,伙计们,我正试图通过字段添加一个m2m,以便让助手调用我的“部门”模型,比如Department.assistants.all(),但在这样做时,我收到了以下错误AttributeError:“ManyToManyField”对象没有属性“\m2m\u reverse\u name\u cache” 这是我的模型: class Department(models.Model): id = models.BigAutoField(primary_key

嘿,伙计们,我正试图通过字段添加一个m2m
,以便让助手调用我的“部门”模型,比如
Department.assistants.all()
,但在这样做时,我收到了以下错误
AttributeError:“ManyToManyField”对象没有属性“\m2m\u reverse\u name\u 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)
我对这个概念很陌生。有人能告诉我我做错了什么吗


如果一个助理只涉及一个部门,那就谢谢了,这是一对多的关系。(一个部门有许多助理)在代码中是:

class Assistant(models.Model):
    ...
    department = models.ForeignKey(Department)
不需要关于部门的特别参考资料。要获得所有助理:

assistants = models.Assistant.objects.filter(department=department)
或在类部门上创建属性:

@property
def assistants(self):
    return models.Assistant.objects.filter(department=self)
assistants = models.Assistant.objects.filter(
    assignment__in=models.Assignment.objects.filter(
        department=department
    )
)

如果一个助理涉及多个部门(每个部门有多个助理),则是多对多关系,他们之间应该有额外的等级:

class Assignment(models.Model):
    assistant = models.ForeignKey(Assistant)
    department = models.ForeignKey(Department)

class Department(models.Model):
    ...
    assignment= models.ForeignKey(Assignment)

class Assistant(models.Model):
    ...
    assignment = models.ForeignKey(Assignment)
因此,在这里查询该部门的助理:

@property
def assistants(self):
    return models.Assistant.objects.filter(department=self)
assistants = models.Assistant.objects.filter(
    assignment__in=models.Assignment.objects.filter(
        department=department
    )
)

根据您定义模型的方式,这些查询似乎太令人困惑了。尝试下面如何定义模型,然后尝试查询

您没有在多对多字段定义中提到through_字段属性。检查文档:

班级部门(models.Model):
#我认为这是不必要的。id在python中也是一个受保护的关键字。
#id=models.BigAutoField(主键=True)
user=models.OneToOneField(settings.AUTH\u user\u MODEL,on\u delete=models.CASCADE)
助手=模型.ManyToManyField(settings.AUTH_USER_MODEL,通过class='assistants',
相关的_name='departments',通过_字段=(“department”,“assistant”))
#型号名称永远不应该是正式的。它是singluar,因为它是对象的名称。
班级助理(模型.模型):
#我认为这是不必要的。id在python中也是一个受保护的关键字。
#id=models.BigAutoField(主键=True)
department=models.ForeignKey(department,on_delete=models.CASCADE)
assistant=models.ForeignKey(settings.AUTH\u USER\u MODEL,verbose\u name=“Department assistant”,on\u delete=models.CASCADE)
added=models.DateTimeField(auto\u now\u add=True)
#如何查询部门助理
#您将获得用户模型的对象
qs=部门助理,全部()
#如何从助手处查询部门
#您将获得部门模型的对象
qs=user.departments.all()
#如果要查询助手模型
#来自部门对象
qs=部门助理_set.all()
#来自辅助对象
qs=user.assistant\u set.all()
#在这两种情况下,您都将获得辅助模型的对象
对于qs中的i:
打印(i.添加、i.部门、i.助理)
试试这个,如果你仍然得到错误,请告诉我


我的建议是将助手模型上的
assistant
字段命名为
user
。这样,您就不需要通过多对多字段上的_字段
定义

我假设来自
助手
外键
与来自
部门
的m2m冲突。这个数据库结构似乎没有任何意义。是的,这似乎是我上面评论的问题。如果你搜索
\u m2m\u reverse\u name\u cache
,已经有一些问题在处理完全相同的情况:你的
设置是什么。AUTH\u USER\u MODEL
和你使用的是哪个版本的Django?settings.AUTH\u USER\u MODEL是我的自定义用户模型,它使用电子邮件而不是用户名登录。。我使用的是Django3.1。谢谢您的回复。我会尝试一下,让你知道。通过_字段使用
有什么缺点吗?没有缺点。但是,根据模型的结构,该字段应称为
user
,而不是
assistant
,因为该模型称为
assistant
。助手对象将用户和部门作为成员更有意义。确定。谢谢。