在数据库一对多关系中,一本书中有多个人物,因此是一对多关系,外键放入多的一边,也就是人物属性中,当为了添加书信息的时候可以添加人物信息时,创建HeroInline类时model=人物类并加入书籍的admin类中,这样就完成了添加书信息的时候可以添加人物信息;
如果想要添加人物信息的时候可以添加书籍信息给书籍类中添加外键属性是会报错的,一对多关系不可以添加2个外键,如果使用多对多关系另有他法。
数据库代码如下:
from django.db import models
class Book(models.Model):
# 默认会有主键, 为id并且自增
# 书籍名称: 字符串区域
btitle = models.CharField(max_length=50,verbose_name='书籍名称')
# 书籍的出版日期, 相当于datetime.date.today()
bpub_date = models.DateField(verbose_name='出版时间')
def __str__(self):
return '%s' %(self.btitle)
class Meta:
db_table='books'
verbose_name='图书信息'
verbose_name_plural='图书信息'
class bHero(models.Model):
hname = models.CharField(max_length=30,verbose_name='姓名')
# 0: 男 1:女
hgender = models.BooleanField(verbose_name='性别')
hcontent = models.CharField(max_length=30,verbose_name='人物详情')
hbook = models.ForeignKey('Book', on_delete=False,verbose_name='所属书籍')
def sex(self):
if self.hgender:
return '男'
else:
return '女'
def __str__(self):
return '%s' % (self.hname)
class Meta:
db_table = 'heros'
verbose_name='人物信息'
verbose_name_plural='人物信息'
django自动生成后台增删改查功能中admin.py内容如下:
class HeroInline(admin.StackedInline): #增加图书信息时可以嵌套增加人物信息
model = bHero
extra = 2
class BookAdmin(admin.ModelAdmin):
list_display = ['id','btitle','bpub_date']
search_fields = ['btitle']
list_filter = ['btitle']
list_per_page = 2
fieldsets = [
('基础信息',{'fields':['btitle']}),('详细信息',{'fields':['bpub_date']})
]
inlines = [HeroInline] #一本书可以有多个人物
class HeroAdmin(admin.ModelAdmin):
list_display = ['id','hname','sex','hcontent']
search_fields = ['hname']
list_filter = ['hname']
list_per_page = 2
fieldsets = [
('基础信息',{'fields':['hname','hgender']}),('详细信息',{'fields':['hcontent']})
]
admin.site.register(Book,BookAdmin) #后台管理书籍
admin.site.register(bHero,HeroAdmin) #后台管理人物