Django 扩展 User 字段:使用 OneToOneField 与 Admin Inlines 实现

竹里
竹里
发布时间:2026-10-13 | 6人浏览过
原创

本文介绍如何在 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 配置的方法即为全部内容,希望能为开发者提供参考与帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表