You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目AbstractUser子类反向访问器冲突迁移错误求助

解决Django多用户模型反向访问器冲突问题

错误原因

当Customer和Chef同时继承AbstractUser时,两个模型都会继承groups和user_permissions字段,而这两个字段默认的反向关联名称完全一致。Django无法区分从Group或Permission模型反向访问Customer和Chef的路径,因此抛出冲突错误。

解决方案

给每个继承AbstractUser的模型,显式指定groups和user_permissions字段的related_name,确保两个模型的反向名称不重复。

修改后的models.py代码如下:

from django.db import models
from django.contrib.auth.models import AbstractUser, Group, Permission
from django.utils.translation import gettext_lazy as _


class Customer(AbstractUser):
    address_line = models.CharField(max_length=255)
    city = models.CharField(max_length=255)
    postal_code = models.CharField(max_length=10)
    phone_number = models.CharField(max_length=20)
    origin_country = models.CharField(max_length=255)
    profile_picture = models.ImageField(upload_to='customer_profile_pics', null=True, blank=True)

    # 自定义反向关联名称
    groups = models.ManyToManyField(
        Group,
        verbose_name=_('groups'),
        blank=True,
        related_name='customer_groups',
        related_query_name='customer',
    )
    user_permissions = models.ManyToManyField(
        Permission,
        verbose_name=_('user permissions'),
        blank=True,
        related_name='customer_permissions',
        related_query_name='customer',
    )


class Chef(AbstractUser):
    address_line = models.CharField(max_length=255)
    city = models.CharField(max_length=255)
    postal_code = models.CharField(max_length=10)
    phone_number = models.CharField(max_length=20)
    origin_country = models.CharField(max_length=255)
    profile_picture = models.ImageField(upload_to='chef_profile_pics', null=True, blank=True)

    # 自定义反向关联名称,与Customer的不重复
    groups = models.ManyToManyField(
        Group,
        verbose_name=_('groups'),
        blank=True,
        related_name='chef_groups',
        related_query_name='chef',
    )
    user_permissions = models.ManyToManyField(
        Permission,
        verbose_name=_('user permissions'),
        blank=True,
        related_name='chef_permissions',
        related_query_name='chef',
    )


class Meal(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    picture = models.ImageField(upload_to='meal_pics')
    country = models.CharField(max_length=255)
    chef = models.ForeignKey(Chef, on_delete=models.CASCADE, related_name='meals')
    customers = models.ManyToManyField(Customer, blank=True, related_name='meals')


class Discussion(models.Model):
    message = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True, blank=True, related_name='discussions')
    chef = models.ForeignKey(Chef, on_delete=models.CASCADE, null=True, blank=True, related_name='discussions')

后续操作

  1. 重新生成迁移文件:
python manage.py makemigrations
  1. 应用迁移:
python manage.py migrate

完成后即可解决冲突,正常启动应用进行测试。

内容的提问来源于stack exchange,提问作者Yassine Rahmani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:37:49