You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用AbstractBaseUser时,其他模型的继承与外键引用问题

问题解答
  • AddressBook和Product的继承方式:两者都应该继承models.Model,只有自定义用户模型(比如你的MyUser)需要继承AbstractBaseUser——AbstractBaseUser是Django专门用来构建自定义用户系统的基类,普通业务模型完全不需要基于它创建。
  • AddressBook的用户外键设置:需要把用户字段设为MyUser的外键,推荐用Django配置里的AUTH_USER_MODEL来引用,而非直接写MyUser,这是Django的最佳实践,后续维护更方便。

代码示例

自定义MyUser模型(简化版)

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

class MyUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('必须填写邮箱字段')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

class MyUser(AbstractBaseUser):
    email = models.EmailField(unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

AddressBook模型(关联自定义用户)

from django.db import models
from django.conf import settings

class AddressBook(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='addresses'
    )
    address_line1 = models.CharField(max_length=255)
    city = models.CharField(max_length=100)
    # 其他地址相关字段...

    def __str__(self):
        return f"{self.user.email}的地址"

Product模型(普通业务模型)

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    description = models.TextField(blank=True)
    # 其他商品相关字段...

    def __str__(self):
        return self.name

关键说明

  • 别让非用户模型继承AbstractBaseUser,否则会引入冗余的用户字段和逻辑,造成数据结构混乱。
  • 使用settings.AUTH_USER_MODEL关联用户模型前,要确保在settings.py里配置了AUTH_USER_MODEL = '你的应用名.MyUser',这样Django才能正确识别你的自定义用户模型。

内容的提问来源于stack exchange,提问作者smoothy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:55:20