自定义的用户模型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