python - 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)
我对这个概念很陌生。有人可以告诉我我在这里做错了什么吗?
谢谢
解决方案
如果一名助理只与一个部门相关 - 这是一对多的关系。(一个部门有很多助手)代码如下:
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
)
)
推荐阅读
- encoding - SQL Developer 口音编码
- magento-1.8 - Magento 1.x - 未找到自定义 JS/CSS
- xampp - 致命错误:未捕获错误:调用未定义函数 mysql_connect?
- jquery - 复选框中的叠加图仅显示第一张底图
- ios - Firestore 应用程序不回调
- html - Bootstrap 4 - 以自定义方式显示卡片
- xcode - 将项目的 Distribution p12 证书文件发布到公共 Github
- php - 从 category-slug 页面链接到自定义帖子存档
- ios - ios深度链接中避免“Safari无法打开页面,因为地址无效”
- plsql - 创建多线程的过程