Django实现带ManyToManyField的Model Mixin运行异常如何解决
Django 含多对多关系的Model Mixin正确实现方案
问题核心原因
原有代码无法运行主要由三个错误导致:
- 作为Mixin的模型类未设置为抽象模型,Django会将其识别为普通独立模型,引发字段、反向关系命名冲突
RightsModelRelation的user_link字段同时设置null=False和default=None,逻辑冲突ManyToManyField类型字段不支持设置default=None,会触发类型错误
修正后代码
mixin.py
from django.db import models from django.contrib.auth.models import User class RightsModelRelation(models.Model): user_link = models.ForeignKey( User, on_delete=models.CASCADE, blank=False, null=False, related_name="%(class)s_rights_user" ) right_to_view = models.BooleanField(default=True) right_to_change = models.BooleanField(default=False) right_to_delete = models.BooleanField(default=False) class Meta: # 若不需要全局权限关联表,可将此处改为abstract=True,后续每个业务模型单独定义关联类 abstract = False class RightsModelMixin(models.Model): rights_link = models.ManyToManyField( RightsModelRelation, related_name="%(class)s_rights_link" ) class Meta: # 必须设置为抽象模型,Django不会为Mixin单独生成数据库表 abstract = True
models.py
from django.db import models from .mixin import RightsModelMixin # RightsModelMixin已继承models.Model,无需重复继承 class Address(RightsModelMixin): lastname = models.CharField(max_length=255, default="") firstname = models.CharField(max_length=255, default="", blank=True, null=True)
可选优化
如果需要每个业务模型的权限数据独立存储,避免不同模型的权限数据混在同一张表,可以将RightsModelRelation也设置为抽象类,在每个业务模型内部单独定义对应的权限关联类即可。
内容的提问来源于stack exchange,提问作者Hamza Khan
相关产品推荐
相关产品推荐

