表结构设计
上篇我们实现了出版社的增删改查,出版社数据表有两个字段id和name,那图书的表结构怎么设计呢?图书也要有一个主键id,还要有一个名称title,是哪个出版社的,要有个字段press和Press表里的id对应,这样图书就需要三个字段,id,title,press
创建表
# 图书表 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) # 书名 press = models.ForeignKey(to='Press',on_delete=models.CASCADE) # 和出版社表关联的字段
因为书和出版社是多对一的关系,一个出版社可以出版多个书,所以外键要写在多的这张表里面,也就是Book表里面
然后执行
python manage.py makemigrations
python manage.py migrate
说明:to='Press' 默认关联的是Press下的主键,on_delete=models.CASCADE级联删除,也就是如果你删除了出版社,Django会把你这个出版社关联的书都删掉。当然你也可以设置成null或者其他的默认值,不需要删除书。Django1.11中,默认就是级联删除,Django2.0之后必须指定on_delete
to=关联的表名,默认关联表里的主键,还有就是我们的字段是press,但是ORM在操作的时候,会在后面加上_id,在数据库里查看字段显示如下
获取表里的数据
我们往数据表里手动加些数据
url(r'^book_list/', views.book_list), # 展示图书列表
在去添加对应的函数
#获取图书列表返回给页面 def book_list(request): #查询所有的书籍 data = Book.objects.all() return render(request, 'book_list.html', {"data":data})
添加book_list.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图书列表</title> </head> <body> <table border="1"> <thead> <tr> <th>序号</th> <th>书ID</th> <th>书名</th> <th>出版社名</th> </tr> </thead> <tbody> {% for i in data %} <tr> <td>{{ forloop.counter }}</td> <td>{{ i.id }}</td> <td>{{ i.title}}</td> <td>{{ i.press.name }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>