假若有一张表(Card)记录用户的卡号信息和用户名,如今须要新增一个小功能,记录用户的手机号,邮箱和住址等更多信息。
为了避免影响原来的表设计,能够新增一张表(CardDetail),专门记录用户的其它更多信息。
银行帐户(Card)和联系方式(CardDetail),一个银行帐户对应一个联系人,而一个联系人也只对应一个帐户,这就是一对一关系。python
在models.py建立数据模型, Card表记录卡号、姓名、添加时间基本的信息,CardDetail使用OneToOneField关联Card表,记录电话、邮箱、城市、详细地址。
OneToOneField里面有两个参数必填,第一个参数传关联的表名称,第二个参数on_delete=models.CASCADE(对象删除后,包含OneToOneField的字段也会被删除)数据库
# models.py from django.db import models # Create your models here. class Card(models.Model): '''银行卡 基本信息''' card_id = models.CharField(max_length=30, verbose_name="卡号", default="") card_user = models.CharField(max_length=10, verbose_name="姓名", default="") add_time = models.DateField(auto_now=True, verbose_name="添加时间") class Meta: verbose_name_plural = '银行卡帐户' verbose_name = "银行卡帐户_基本信息" def __str__(self): return self.card_id class CardDetail(models.Model): '''银行卡 详情信息''' card = models.OneToOneField(Card, on_delete=models.CASCADE, verbose_name="卡号" ) tel = models.CharField(max_length=30, verbose_name="电话", default="") mail = models.CharField(max_length=30, verbose_name="邮箱", default="") city = models.CharField(max_length=10, verbose_name="城市", default="") address = models.CharField(max_length=30, verbose_name="详细地址", default="") class Meta: verbose_name_plural = '我的资料' verbose_name = "帐户_我的资料" def __str__(self): return self.card.card_user
admin.py设置后台页面显示详情django
# admin.py from django.contrib import admin from hello import models # Register your models here. class MoreInfo(admin.StackedInline): model = models.CardDetail @admin.register(models.Card) class ControlCard(admin.ModelAdmin): list_display = ["card_id", "card_user", "add_time"] # 在Card页面显示更多信息CardDetail inlines = [MoreInfo]
表设计好以后执行下面两句设计
makemigrations会在当前目录下生成一个migrations文件夹,该文件夹的内容就是数据库要执行的内容code
python manage.py makemigrations对象
migrate就是执行以前生成的migrations文件,这一步才是操做数据库的一步blog
python manage.py migrate继承
为了让 CardDetail 里面信息和Card的信息在一个页面上展现,这里需用到 inlines 参数,关联过去。
先写一个MoreInfo类,继承了admin.StackedInline,StackedInline是让关联的字段纵向显示,多说无益,直接看效果。ci
列表页面it
编辑页面
StackedInline是纵向显示,显示效果如上面图,TabularInline是横线显示,显示效果以下图
# amdin.py # StackedInline改为StackedInline class MoreInfo(admin.StackedInline): model = models.CardDetail @admin.register(models.Card) class ControlCard(admin.ModelAdmin): list_display = ["card_id", "card_user", "add_time"] # 在Card页面显示更多信息CardDetail inlines = [MoreInfo]