Django 扩展 User 字段:使用 OneToOneField 与 Admin Inlines 实现
本文介绍如何在 Django 中通过 OneToOneField 扩展内置 User 模型,并配置 Admin 后台使用 StackedInline 实现内联编辑。涵盖模型定义、Admin 注册及关联数据查询技巧,包括使用双下划线语法进行跨表筛选。
Django 扩展 User 模型的基本原理
在 Django 中扩展内置的 User 模型,通常采用一对一关系(OneToOneField)来存储额外的用户信息。
定义一对一关联模型
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='昵称')
nickname = models.CharField(max_length=20)
def __str__(self):
return '<Profile: %s for %s>' % (self.nickname, self.user.username)
Admin 后台内联配置
接下来需要在 admin.py 文件中配置后台管理界面,以便在用户管理页面中直接编辑扩展字段。
配置 StackedInline 与 UserAdmin
from django.contrib import admin
from django.contrib.auth.models import User
from .models import Profile
class ProfileInline(admin.StackedInline): #将Profile加入到Admin的user表中,内联
model = Profile
can_delete = False
class UserAdmin(admin.ModelAdmin):
inlines = [ProfileInline]
list_display = ('username', 'nickname', 'email', 'is_staff', 'is_active', 'is_superuser')
def nickname(self, obj):
return obj.profile.nickname #自定义字段显示信息
nickname.short_description = '昵称'
# Re-register UserAdmin
admin.site.unregister(User) #去掉在admin中的注册
admin.site.register(User, UserAdmin) #用UserAdmin注册user
OneToOneField 工作机制与取值示例
补充知识:Django model onetoonefield的工作模式
OneToOneField 实现了一对一关联机制,确保每条记录只对应关联表中的一条信息。关联键即为该字段的主键(id),这保证了数据的唯一性和直接映射关系。
具体用法如下:
1、取值操作
假设 User 为 Django 自带的用户表,我们需要关联一个详细信息表,其模型类为 UserBaseMsg(对应数据库表 user_base_msg),以及另一张存储员工状态信息的表,模型类为 UserWorkMsg(对应表 user_work_msg)。在这两张关联表中,外键字段均命名为 user,指向主 User 表。
若需获取详细信息表中的 a 字段值,以及工作信息表中的 b 字段值,
首先通过 get 方法获取 User 实例:
a = user.userbasemsg.a
b = user.userworkmsg.b
基于关联表的查询技巧
此外,还可以根据关联表的字段筛选 User 信息。
例如,筛选出 UserBaseMsg 中 a 字段等于 c 的 User:
此处 get 方法还可以替换为 filter、exclude 等其他查询条件,以实现更灵活的数据库操作。
在 UserBaseMsg__a 后,可以追加各种查询条件后缀来细化筛选结果。
常用的查询条件后缀包括:
__in = # 用于筛选字段值在给定列表范围内的记录
__gt = # 用于筛选字段值大于指定值的记录
__gte = # 用于筛选字段值大于或等于指定值的记录
__lt = # 用于筛选字段值小于指定值的记录
__lte = # 用于筛选字段值小于或等于指定值的记录
以上关于 Django 扩展 User 字段并使用 Inlines 配置的方法即为全部内容,希望能为开发者提供参考与帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













