1. 程式人生 > >Django ORM 一對多操作

Django ORM 一對多操作

主表 操作 length 成功 關聯 clas reat book 視圖

創建表

# models.py

form django.db import models

class Book(models.Model):  # 表名book,django會自動使用項目名+我們定義的表名
  # 如沒有自定義主鍵,django會自動添加一個主鍵,字段名id 自增
  name = models.CharField(max_length=20)  # 字段名name 類型 vachar(20)
  price = models.IntegerField()   # 字段名price 類型int
  pub_date = models.DateField()   # 字段名pub_date 類型 date (時間戳)
  publish = models.ForeighKey(‘Publish‘)  # 創建外鍵關聯到Publish表的id字段,django會自動將該名稱改為publish_id  
# 如果這樣寫 publish = models.ForeighKey(Publish) 括號內無引號,則必須將Publish類放到Book類的上面
  def __str__(self):     return self.name  # 打印實例對象時顯示為self.name

class Publish(models.Model):
  name = models.CharField(max_length=32)

  city = models.CharField(max_length=32)

一對多的添加

# views.py

from django.shortcuts import render
from app_name.models import *  # 導入models.py

def add(request):  # 增加數據的視圖函數
  # 方式一 直接對publish_id賦值
  Book.objects.create(name=Linux基礎,price=99,author=yuan,pub_date=2017-12-12‘,publish_id=2)
  # 方式二 通過創建一個publish的對象直接對publish賦值
publish_obj = Publish.objects.filter(name=‘人民出版社‘)[0]  
  
Book.objects.create(name=‘Linux基礎‘,price=99,author=‘yuan‘,pub_date=‘2017-12-12‘,publish=publish_obj)
  return HttpResponse(添加成功)

得出結論:1.publish_id 對應一個數字
2.publish對應一個publish的實例對象  

一對多的查詢

# 怎麽使用一對多查詢呢?
book_obj = Book.objects.get(name=‘python‘)
print(book_obj.name)  # python
print(book_obj.publish)  # Publish object  是與book對應的Publish的對象
print(type(book_obj.publish))  # <class ‘app01.models.Publish‘>

# 獲取所有人民出版社的書(通過對象)
# 通過書來找出版社(子表找主表)正向查詢
publish_obj = Publish.objects.get(‘人民出版社‘)[0]
ret = book_obj=Book.objects.filter(publish=publish_obj)
# 通過出版社來找書 (主表找子表) 反向查詢
publish_obj = Publish.objects.get(‘人民出版社‘)[0]
ret = publish_obj.book_set.all()  # 通過publish對象去找book表中其所有對應的數據 (book_set對就的就是子表book的書的集合)

# 通過雙下劃線查詢 (可以用在filter與values中)
1.獲取所有人民出版社的書
Book.objects.filter(publish__name=‘人民出版社‘)
Publish.objects.filter(name=‘人民出版社‘).values(‘book__name‘)
2.獲取python這本書出版社的名字
Publish.objects.filter(book__name=‘python‘)
Book.objects.filter(name=‘python‘).values(‘publish__name‘)
3.獲取所有北京的出版社出過所有的書
Book.objects.filter(publish__city=‘北京‘)
Publish.objects.filter(city=‘北京‘).values(‘book__name‘)

Django ORM 一對多操作