You need to enable JavaScript to run this app. Django实现带ManyToManyField的Model Mixin运行异常如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 01:24:10