Admin后台对存在数据库外键时数据关联的几种方式

Admin后台对存在数据库外键时数据关联的几种方式

背景

django中建立数据库模型时经常会用到外键,那么在数据库中会存在如下几种显示外键的形式。

假设现在我们有两个数据库表

#models.py from django.db import models import hashlib # Create your models here. class Users(models.Model): username = models.CharField(verbose_name='账号', max_length=128) password = models.CharField(verbose_name='密码', max_length=128) # 在保存的时候对密码进行md5加密 def save(self, *args, **kwargs): m = hashlib.md5() m.update(self.password.encode('utf-8')) self.password = m.hexdigest() return super(Users, self).save(*args, **kwargs) class PersonInfo(models.Model): person = models.ForeignKey(Users,verbose_name='用户ID', on_delete=models.CASCADE) email = models.EmailField(verbose_name='邮箱', max_length=128) remark = models.CharField(verbose_name='备注', max_length=128)


普通内联

普通的内联就是admin后台页面添加时显示为一个下拉菜单,选择对应的外键信息

# admin.py from django.contrib import admin from .models import * # Register your models here. class UsersAdmin(admin.ModelAdmin): list_display = ('username', 'password') class PersonInfoAdmin(admin.ModelAdmin): list_display = [field.attname for field in PersonInfo._meta.fields] admin.site.register(Users, UsersAdmin) admin.site.register(PersonInfo, PersonInfoAdmin)

选择框内联

选择框内联就是admin后台页面添加时显示为一个搜索框,点击放大镜会弹出一个新页面选择对应的外键信息。这个方式好处就是选择的时候可以看到外联数据的所有字段信息

# admin.py from django.contrib import admin from .models import * # Register your models here. class UsersAdmin(admin.ModelAdmin): list_display = ('username', 'password') class UsersInlines(admin.TabularInline): model = Users class PersonInfoAdmin(admin.ModelAdmin): list_display = [field.attname for field in PersonInfo._meta.fields] raw_id_fields = ['person'] admin.site.register(Users, UsersAdmin) admin.site.register(PersonInfo, PersonInfoAdmin)

Users添加时同时添加PersonInfo信息

这种方式和上面两种都不同,上面都是添加 PersonInfo 时选择 Users 。这一种是在添加或者修改Users的信息时同时添加或者修改PersonInfo的信息

# admin.py from django.contrib import admin from .models import * # Register your models here. class PersonInfoInlines(admin.TabularInline): model = PersonInfo class UsersAdmin(admin.ModelAdmin): list_display = ('username', 'password') inlines = [PersonInfoInlines] class PersonInfoAdmin(admin.ModelAdmin):