ORM正向和反向查詢


表結構

from django.db import models

# Create your models here.
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)


class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)

publisher = models.ForeignKey('Publisher', related_name='person_book', related_query_name='ooxx')

插入數據

# Book表
id title pubtime person_id
1 書1 1533225600000 1 2 書2 1533225600000 1 3 書3 1534435200000 1 4 書4 1535644800000 2 5 書5 1535126400000 3
# Publisher表
id name 1 出版社1 2 出版社2 3 出版社3

正向查詢: 外鍵所在表去查另一張表,Book >> Publisher

反向查詢:普通表去查外鍵所在的表,Publisher >> Book

正向查詢,基於對象跨表查詢

book_obj = models.Book.objects.all()  # 取到書籍對象
book_obj.publisher.name # 書籍的出版社名字,html
book_obj.person.id # 書籍的出版社id,html

跨表查詢,利用雙下划線跨表查詢

models.Book.objects.filter(id=1).values('publisher__name')  # 查詢id是1的書的出版社的名字,一條雙下划線就是跨一張表
models.Book.objects.filter(id=1).values_list('publisher__name')

反向查詢

對象查詢  obj.表名_set()

publisher_obj = models.Publisher.objects.first()  # 找到第一個出版社對象
ret = publisher_obj.book_set.all()  # 找到第一個出版社出版的所有數
for i in ret:  # 循環對象
    print(i.name)  # 打印出每一個書的書名
publisher_obj = models.Publisher.objects.first()  # 找到第一個出版社對象
books = publisher_obj.book_set.all()  # 找到第一個出版社出版的所有書
titles = books.values_list("name")  # 找到第一個出版社出版的所有書的書名
print(titles)
因為使用了releted_name,就是用person_book代替了表字段名字
表字段person = models.ForeignKey(Person, related_name='person_book')
所以這一這樣寫
books = publisher_obj.person_book.all()
titles = books.values_list('name')
print(titles)
如果表字段person = models.ForeignKey(Person, related_name='person_book',related_query_name="xxoo")
related_query_name="xxoo",這里表示跨表查詢xxoo代替表的名字book
books = publisher_obj.ooxx_set.all()

基於雙下划線

ret = models.Publisher.objects.filter(id=1).values_list('person_book__name')
person_book是通過releted_name給對應關系起的名字,通過person_book就找到了關聯的表,再通過雙下划線找到name
print(ret)

附帶django里面腳本的代碼

import os

if __name__ == '__main__':
    # 加載Django項目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "項目名.settings")
    # 導入Django,並啟動Django項目
    import django
    django.setup()

    from app01 import models
    # 查詢id為1的出版社出版的所有書的name
    ret = models.Publisher.objects.filter(id=1).values_list('person_book__name')
    print(ret)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM