python學習第七十五天:多表查詢
阿新 • • 發佈:2018-09-11
object rim pytho 連表查詢 mit str () tle detail
創建模型
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學習第七十五天:多表查詢