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')
后续操作
- 重新生成迁移文件:
python manage.py makemigrations
- 应用迁移:
python manage.py migrate
完成后即可解决冲突,正常启动应用进行测试。
内容的提问来源于stack exchange,提问作者Yassine Rahmani
相关产品推荐
相关产品推荐

