1. 程式人生 > >python學習第七十五天:多表查詢

python學習第七十五天:多表查詢

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學習第七十五天:多表查詢