Django之Models(二)
创建一对多的关系
一个出版商可以有多本出版的书 一本书只有一个出版商
创建一对多的语法:
字段名= models.ForeignKey(关联表(类名),on_delete=[选项])
注意:这里外键字段名不要在加上id,默认会加上。
我在这里加上了ID,会变成publisherID_id。
1 from django.db import models 2 3 # Create your models here. 4 5 6 7 class Publisher(models.Model): 8 name = models.CharField(max_length=30) 9 city = models.CharField('城市',max_length=60) 10 11 class Book(models.Model): 12 name=models.CharField(max_length=20) 13 price=models.IntegerField() 14 pub_date=models.DateField() 15 author=models.CharField(max_length=32,null=False) 16 publisherID= models.ForeignKey(Publisher,on_delete=models.SET)
报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'
注意:一定要加上on_delete参数
on_delete参数的各个值的含义: on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为 on_delete=models.CASCADE, # 删除关联数据,与之关联也删除 on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做 on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True) on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理) # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值') on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理) on_delete=models.SET, # 删除关联数据, a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
增加数据
方式一: #publisherID_id=2:通过赋值的办法 Book.objects.create(name="linux运维",price=77,pub_date="2019-02-10",author="",publisherID_id=2) 方式二: #publisherID=publish_obj:通过赋值对象的办法 publish_obj=Publish.objects.filter(name="人民出版社")[0] #这里filter返回是一个集合对象,使用需要[]取出来用 Book.objects.create(name="linux运维",price=77,pub_date="2019-02-10",author="",publisherID=publish_obj)
查询数据
正向查询 # book_obj=Book.objects.get(name="python") # print(book_obj.name) print(book_obj.price) print(book_obj.pub_date) print(book_obj.author) # 如何拿到与它绑定的Publisher对象呢? # 一对多:这里外键publisherID一定是一个对象 # print(book_obj.publisherID.name) # print(book_obj.publisherID.city)
反向查询
pub_obj=Publisher.objects.filter(name="人民出版社")[0] print(pub_obj.name) print(pub_obj.city) #pub_obj.book_set是一个queryset集合 #如何拿到与它绑定的Book对象呢? print(pub_obj.book_set.all().values('name','price'))
(filter valuse 双下划线)
#正向查询:通过外键 人民出版社出版的书籍的书名和价格 ret1=Book.objects.filter(publsiherID_name="人民出版社").values("name","price") #反向查询:通过类名 书名为python的书籍的出版社是谁 ret2=Publish.objects.filter(Book_name="python").values("name") 或 ret3=Book.objects.filter(name="python").values("publisherID_name") 出版社的地点在北京的出版社出过哪些书籍 ret4=Book.objects.filter(publisherID_city="北京").values("name")