扩展 django 自带的 User Model 字段
在实际项目中,django 自带的 user model 的字段很多时候不能够满足我们的需求,可能我们需要在 user 中加入商城积分等字段,这就需要通过扩展的 user model 字段来实现。目前扩展 user 字段我找到的有 4 种方式。
1. 通过新建 model 然后指定 OneToOne 的 user 字段(官方推荐)
class UserProfile(models.Model):
user = models.OneToOne(User, related_name="profile", on_delete=models.CASCADE)
phone_num = models.CharField(max_length=20, unique=True, blank=True)
# 当生成 user 的时候自动生成 UserProfile,参考之前的 token 生成
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_profile(sender, instance=None, created=False, **kwargs):
if created:
profile, created = UserProfile.objects.get_or_create(user=instance)
接着需要在 admin 做些设置
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class ProfileInline(admin.StackInlin):
model = UserProfile
can_delete = False
verbose_name_plural = "profile"
class UserAdmin(UserAdmin):
inlines = (ProfileInline,)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
然后通过迁移数据库,django 会同时生成 user 表和 user_profile 表
这个方法虽然是官方推荐的,但是个人还是觉得很麻烦,获取 profile 的字段值还需要通过 user 表的外键获取 profile 实例,然后再获取字段值,再考虑到 django 的通过外键生成反向字段也需要做些处理,如果说我们只需要额外添加一个字段,需要做那么多工作,我是拒绝的。

浙公网安备 33010602011771号