python学习第七十五天:多表查询
Posted luck_L
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘))
以上是关于python学习第七十五天:多表查询的主要内容,如果未能解决你的问题,请参考以下文章