auth.User.groups: (fields.E304) Reverse accessor ‘Group.user_set‘ for ‘auth.User.groups‘ clashes wit

自定义的用户模型class MyUser(AbstractUser)执行报错,

django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
auth.User.groups: (fields.E304) Reverse accessor 'Group.user_set' for 'auth.User.groups' clashes with reverse accessor for 'users.MyUser.groups'.
        HINT: Add or change a related_name argument to the definition for 'auth.User.groups' or 'users.MyUser.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor 'Permission.user_set' for 'auth.User.user_permissions' clashes with reverse accessor for 'users.MyUser.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'auth.User.user_permissions' or 'users.MyUser.user_permissions'.
users.MyUser.groups: (fields.E304) Reverse accessor 'Group.user_set' for 'users.MyUser.groups' clashes with reverse accessor for 'auth.User.groups'.
        HINT: Add or change a related_name argument to the definition for 'users.MyUser.groups' or 'auth.User.groups'.
users.MyUser.user_permissions: (fields.E304) Reverse accessor 'Permission.user_set' for 'users.MyUser.user_permissions' clashes with reverse accessor for 'auth.User.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'users.MyUser.user_permissions' or 'auth.User.user_permissions'.

这是因为:


class PermissionsMixin(models.Model):
    """
    Add the fields and methods necessary to support the Group and Permission
    models using the ModelBackend.
    """

    is_superuser = models.BooleanField(
        _("superuser status"),
        default=False,
        help_text=_(
            "Designates that this user has all permissions without "
            "explicitly assigning them."
        ),
    )
    groups = models.ManyToManyField(
        Group,
        verbose_name=_("groups"),
        blank=True,
        help_text=_(
            "The groups this user belongs to. A user will get all permissions "
            "granted to each of their groups."
        ),
        related_name="user_set",
        related_query_name="user",
    )
    user_permissions = models.ManyToManyField(
        Permission,
        verbose_name=_("user permissions"),
        blank=True,
        help_text=_("Specific permissions for this user."),
        related_name="user_set",
        related_query_name="user",
    )

而默认的系统用户也是继承AbstractUser

class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username and password are required. Other fields are optional.
    """

    class Meta(AbstractUser.Meta):
        swappable = "AUTH_USER_MODEL"

groups和user_permissions都是ManyToManyField,都会生成一个新的数据表,就会产生冲突

ManyToManyField 是 Django 模型中用于表示多对多关系的一个字段类型。它允许一个模型与另一个模型之间建立多对多的关联,也就是说,一个模型的实例可以与多个另一模型的实例关联,并且反之亦然。

下面是一个简单的例子,假设我们有一个 Book 模型和一个 Author 模型,一本书可以有多个作者,一个作者也可以写多本书。我们可以使用 ManyToManyField 来表示它们之间的关系:

# models.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    authors = models.ManyToManyField(Author)

在上述例子中,Book 模型包含了一个 authors 字段,它是一个 ManyToManyField。这个字段建立了 Book 和 Author 之间的多对多关系。

Django 将会自动创建一个中间表,用于存储书籍与作者之间的关系。这个中间表将包含书籍的 ID、作者的 ID 等信息。在这种关系中,每个书籍可以与多个作者关联,每个作者也可以与多本书关联。

使用这种关系,我们可以很方便地进行查询和操作,例如:

# 创建书籍和作者
author1 = Author.objects.create(name='Author 1')
author2 = Author.objects.create(name='Author 2')

book = Book.objects.create(title='Book 1')

# 关联书籍和作者
book.authors.add(author1, author2)

# 查询一本书的所有作者
authors_of_book = book.authors.all()

需要注意的是,ManyToManyField 的定义可以放在任何一个相关模型中,不一定非要放在两个关联的模型中的某一个。在上面的例子中,我们将其定义在 Book 模型中,但也可以在 Author 模型中定义,效果是一样的。
因此有两种解决办法:
1.AUTH_USER_MODEL = ‘users.MyUser’

实际上是告诉 Django 使用你自定义的用户模型替代默认的 auth.User 模型。这样,Django 将在数据库中创建新的表,不再包含 auth.User 中的 groups 字段,从而避免了冲突。

2.在自定义MyUser模型中增加数据类型覆盖掉:

class MyUser(AbstractUser):
	groups=None
	user_permissions=None

猜你喜欢

转载自blog.csdn.net/liulanba/article/details/134858857