Django 1.6中AbstractUser的m2m模型验证错误

6

我在使用Django 1.5.4(稳定版)时没有出现错误,但当我在官方tar.gz上测试我的应用程序时,在Django 1.6 beta 4上启动时会出现验证模型的错误。


models.py

from django.contrib.auth.models import AbstractUser, User

class ShopUser(AbstractUser):
    model_car = models.CharField(max_length=200)
    date_car = models.DateField()
    description = models.TextField(blank=True, db_index=True)

    manager = models.ForeignKey(User)

以下是 manage.py runserver 命令的控制台日志:

Validating models...

Unhandled exception in thread started by <function wrapper at 0x2d941b8>
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 93, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/runserver.py", line 97, in inner_run
    self.validate(display_num_errors=True)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 312, in validate
    raise CommandError("One or more models did not validate:\n%s" % error_text)
django.core.management.base.CommandError: One or more models did not validate:

adminka.shopuser: Accessor for m2m field 'groups' clashes with related m2m field 'Group.user_set'. Add a related_name argument to the definition for 'groups'.
adminka.shopuser: Accessor for m2m field 'user_permissions' clashes with related m2m field 'Permission.user_set'. Add a related_name argument to the definition for 'user_permissions'.
auth.user: Accessor for m2m field 'groups' clashes with related m2m field 'Group.user_set'. Add a related_name argument to the definition for 'groups'.
auth.user: Accessor for m2m field 'user_permissions' clashes with related m2m field 'Permission.user_set'. Add a related_name argument to the definition for 'user_permissions'.
  • python -c "import django;print django.get_version()"
    1.6b4

如何解决这个问题?


1
从源代码来看(https://github.com/django/django/blob/1.6b4/django/contrib/auth/models.py#L448),“用户”继承自“AbstractUser”。这就是为什么会发生冲突的原因? - karthikr
3个回答

15

您需要在您的 settings.py 文件中声明 AUTH_USER_MODEL。在您的情况下:

AUTH_USER_MODEL = 'your_app.ShopUser'

2
即使您使用的是AbstractUser而不是AbstractBaseUser,也需要正确记录此设置。https://code.djangoproject.com/ticket/19049#no2 - Shrey

1

对我来说,通过更改以下内容,Django 1.6.5已经修复了这个问题:

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

转换为:

from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):
    pass

在Django 1.6.5中不需要进行其他更改。@Stormlifter的建议有一定的价值,但我正在使用这个CustomUser与python-social-auth通过OAuth2进行交互的东西。
$ pip freeze
Django==1.6.5
Markdown==2.4.1
MySQL-python==1.2.5
PyJWT==0.2.1
South==1.0
basicauth==0.2
boto==2.28.0
django-filter==0.7
django-guardian==1.2.0
django-storages==1.1.8
djangorestframework==2.3.14
httplib2==0.9
oauth2==1.5.211
oauthlib==0.6.3
python-memcached==1.53
python-oauth2==0.7.0
python-openid==2.2.5
python-social-auth==0.2.1
requests==2.4.1
requests-oauthlib==0.4.1
shortuuid==0.4.2
six==1.7.2
wsgiref==0.1.2

我的新CustomUser将完成比默认用户更多的工作,并且需要像@jordiburgos建议的那样在settings.py中成为AUTH_USER_MODEL ='myapp.CustomUser'。
希望这有所帮助!

0

你想从 AbstractBaseUser 继承,而不是从 AbstractUser 继承。

然而,看起来你只是想为用户存储一些额外的信息,我不建议使用自定义用户模型。只需使用关系即可。

class ShopUser(models.Model):
    model_car = models.CharField(max_length=200)
    date_car = models.DateField()
    description = models.TextField(blank=True, db_index=True)
    user = models.OneToOneField(User)

如果您需要让多个ShopUser关联到单个用户,您可以将其设置为ForeignKey,但我认为OneToOne是最合适的。

正如Django文档所述:

指定自定义用户模型

AbstractBaseUser


自定义用户模型似乎是一个合适的方法,为什么你不想推荐它呢? - Mark
既然不是所有用户都是商店用户,而且通常情况下每次调用用户时可能并不需要这些数据,因此建立关系可以改善数据的组织,但这并非必要,每个人都应该根据自己的应用程序设计自己的数据库。 - stormlifter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接