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
相关产品推荐
相关产品推荐

