Python-Django继承数据库表

Python-Django继承数据库表,第1张

  • 作为一个Python小白,公司中老师交给我一个需求,要求修改添加人员方法。


    之前的字段太多了,根据models中定义的字段来修改。


    我改了一天没改出来,也没有报错,只是提醒我该用户名已存在,但是数据库中没有这个用户名,第二天我问老师,他跟我讲解我才清楚。


  • 由于之前字段和数据库中都包含username和name,而且models文件中定义的数据库表字段只有name没有username,所以我在所有有关于username的地方包括create_user去数据库创建用户时把username都删了。


    但是老师告诉我说,User继承了Django自带的类User类,在自带的User类中我们要看username是否被定义,如果没被定义我们要手动给它定义一下:

  • 我们注意到在models.User中继承了AbstractUser这个类,我们点进去看
class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

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

    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _("username"),
        max_length=150,
        unique=True,
        help_text=_(
            "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
        ),
        validators=[username_validator],
        error_messages={
            "unique": _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_("first name"), max_length=150, blank=True)
    last_name = models.CharField(_("last name"), max_length=150, blank=True)
    email = models.EmailField(_("email address"), blank=True)
    is_staff = models.BooleanField(
        _("staff status"),
        default=False,
        help_text=_("Designates whether the user can log into this admin site."),
    )
    is_active = models.BooleanField(
        _("active"),
        default=True,
        help_text=_(
            "Designates whether this user should be treated as active. "
            "Unselect this instead of deleting accounts."
        ),
    )
    date_joined = models.DateTimeField(_("date joined"), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = "email"
    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ["email"]

    class Meta:
        verbose_name = _("user")
        verbose_name_plural = _("users")
        abstract = True

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def get_full_name(self):
        """
        Return the first_name plus the last_name, with a space in between.
        """
        full_name = "%s %s" % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)
  • 我们发现username没有被定义,而其他字段已被定义,例如first_name、last_name、email、is_staff…所以我们要在创建数据库语句时定义一下username的值,如下:
  • 这样就可以啦!
    对于Django的继承我只理解了当下需要的,之后有更多理解会继续记下笔记的!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/568152.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存