扩展 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 的通过外键生成反向字段也需要做些处理,如果说我们只需要额外添加一个字段,需要做那么多工作,我是拒绝的。




posted @ 2019-02-13 17:52  hayabky  阅读(419)  评论(0)    收藏  举报