python学习第七十五天:多表查询

创建模型

class Book(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) publish_date = models.DateField() # 阅读数 reat_num=models.IntegerField(default=0) # 评论数 commit_num=models.IntegerField(default=0) publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE) authors=models.ManyToManyField(to='Author') def __str__(self): return self.name class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE) class AuthorDatail(models.Model): nid = models.AutoField(primary_key=True) telephone = models.BigIntegerField() birthday = models.DateField() addr = models.CharField(max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() 表关系创建(上面已经写了) 一个出版社可以出版多本书,一本书只能有一个出版社 一对多(一旦确立了一对多的关系,关联字段要放在多的表里) models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE) 一个作者可以写多本书,一本书可以有多个作者 多对多(需要第三张表) models.ManyToManyField(to='Author') 一对一 author和author_detail是一对一 models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE) 

添加表记录

一对多
方式1:
   publish_obj=Publish.objects.get(nid=1) book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish=publish_obj) 方式2: book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish_id=1) 
多对多
# 当前生成的书籍对象
book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1) # 为书籍绑定的做作者对象 yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录 egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录 # 绑定多对多关系,即向关系表book_authors中添加纪录 book_obj.authors.add(yuan,egon) # 也可以传入pk值或者*(yuan,egon) 

基于对象的多表查询(子查询)

A表book(关联自动段)   B表 publish
    # 正向查询 A--->B # 反向查询 B-->A 总结:一对一 正向:按字段 反向:按表名小写 一对多 正向:按字段 反向:按表名小写_set 多对多 正向:按字段 反向:按表名小写_set 

基于下划线的多表查询(连表查询)

总结:用__告诉orm,要连接那个表
    一对一: 正向:按字段 反向:按表名小写 一对多: 正向:按字段 反向:按表名小写 多对多: 正向:按字段 反向:按表名小写 

聚合查询

from django.db.models import Avg,Count,Max,Min,Sum
Book.objects.all().aggregate(c=Avg('price')) 

F和Q

from django.db.models import F,Q F: F() 的实例可以在查询中引用字段: Book.objects.filter(commit_num__gt=F('reat_num')).values('name') 把所有书的价格加1: Book.objects.all().update(price=F('price')+1) Q: | & 和 ~ Book.objects.all().filter(Q(name='在人间')|Q(price='13')) Book.objects.all().filter(~Q(name='在人间')& Q(price='13'))

猜你喜欢

转载自www.cnblogs.com/luck-L/p/9629684.html