正确使用django AbstractBaseUser类

时间:2017-04-13 20:03:01

标签: python django abstract-class

我试图通过扩展AbstractBaseUser元类来超越教程级知识并创建我自己的用户类,但是我找不到实际显示如何通过这种类型的模型进行交互的示例API。这是我的模特:

from __future__ import unicode_literals
from django.db import models
from django.utils.translation import ugettext as _

class Country(models.Model):
    iso3166 = models.CharField(_("country ISO 3166"), max_length=3, default="840", primary_key=True)
    name = models.CharField(_("country name"), max_length=40, default="USA")

    def __unicode__(self):
        return self.name

class MyUser(AbstractBaseUser):
    postal_code = models.CharField(_("zip code"), max_length=5, blank=True, default='')
    country = models.ForeignKey(Country)REQUIRED_FIELDS = ['country']

在这里,我试图通过shell与它进行交互:

from myapp.models import MyUser, Country
from django.utils.translation import ugettext as _
c = Country(iso3166="840",name=_("United States of America"))
c.save()
q = Country.objects.get(iso3166="840")
g = MyUser(username="bob",password="pass1",first_name="Robert",last_name="Smith",email="bob@here.net",country=q)

哪个工作正常,直到我定义g的行,从而得到错误:

TypeError: 'username' is an invalid keyword argument for this function

我得到了错误所说的内容并且不介意,但我不确定创建新的MyUser对象的正确语法是什么。

1 个答案:

答案 0 :(得分:1)

AbstractBaseUser没有定义自己的任何字段(除了password和last_login)。因此,您只能传递您在子类中定义的字段:postal_code和country。

在实践中,这很少有用;你可能想要继承AbstractUser,它确实定义了用户名和电子邮件字段等。