首页 > 解决方案 > django 模型中的 m2m“通过”字段引发此错误:“M2M 字段”对象没有属性“_m2m_reverse_name_cache”

问题描述

嘿伙计们,我正在尝试添加一个 m2mthrough字段,以便让我的“部门”模型的助手可以调用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)

我对这个概念很陌生。有人可以告诉我我在这里做错了什么吗?

谢谢

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


如果一名助理只与一个部门相关 - 这是一对多的关系。(一个部门有很多助手)代码如下:

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

无需特别提及部门。获取所有助手:

assistants = models.Assistant.objects.filter(department=department)

或者在类 Department 上创建一个属性:

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

如果一个助手涉及多个部门(每个部门有多个助手),是多对多的关系,它们之间应该有额外的类:

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)

所以在这里查询部门助理:

assistants = models.Assistant.objects.filter(
    assignment__in=models.Assignment.objects.filter(
        department=department
    )
)

推荐阅读