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):