64.Python中ORM查詢條件:in和關聯模型

定義模型的models.py文件中示例代碼以下:
from django.db import models


class Category(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        db_table = 'category'


class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True)

    def __str__(self):
        return "<(Article: id: %s,title: %s, content: %s)>" % (self.id, self.title, self.content)

    class Meta:
        db_table = 'article'
1.in:查找某個字段的數據是否在某個集合中。示例代碼以下:
from django.http import HttpResponse
from .models import Article, Category


def index(request):
# 查找id爲1,2,3的文章
    articles = Article.objects.filter(id__in=[1,2,3])
    for article in articles:
        print("%s, %s, %s"%(article.id, article.title, article.content))
    # 1, Hello, 你好
    # 2, Hello World, 你們好
    # 3, 鋼鐵是怎樣煉成的, 你好

    # 打印出sql語句:
    print(articles.query)
    # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` IN (1, 2, 3)
    return HttpResponse("success")
2. in: 查找另外一張表中的字段是否在某個集合中。查找id爲1,2,3的文章的分類,示例代碼以下:
def index(request):
    # in:查找id爲1,2,3的文章的分類
    # 涉及到兩個表
    # 父表Category能夠經過子表名字的小寫形式進行訪問子表,一樣若是不想使用默認的名字進行訪問,
    # 能夠在指定外鍵的時候指定參數related__query__name='articles',以後就能夠經過articles進行訪問子表了。
    categorys = Category.objects.filter(article__id__in=[1,2,3])

    # 若是你判斷的模型的字段就是模型的主鍵,那麼就能夠使用article__in
    categorys = Category.objects.filter(article__in=[1,2,3])

    for category in categorys:
        print("%s, %s"%(category.id, category.name))
    # 1, 最新文章
    #
    # 2, 最熱文章
    # 3, 高評分文章
    print(categorys.query)
    # SELECT `category`.`id`, `category`.`name` FROM `category` INNER JOIN `article` ON (`category`.`id` = `article`.`category_id`) WHERE `article`.`id` IN (1, 2, 3)
    return HttpResponse("success")
3. 查找標題中包含「hello」的文章的分類,示例代碼以下:
# 查找標題中包含「hello」的文章的分類
    # 首先將標題中包含hello的文章查詢出來
    articles = Article.objects.filter(title__icontains="hello")
    # 以後查找這些文章的分類
    categorys = Category.objects.filter(article__id__in=articles)
    for category in categorys:
        print(category)
    # Category object (1)
    # Category object (2)

    print(categorys.query)
    # SELECT `category`.`id`, `category`.`name` FROM `category` INNER JOIN `article` ON (`category`.`id` = `article`.`category_id`) WHERE `article`.`id` IN (SELECT U0.`id` FROM `article` U0 WHERE U0.`title` LIKE %hello%)
    return HttpResponse("success")

總結:1. 在父表(category)對子表(article)進行反向查詢的時候,默認狀況下能夠經過子表名字的小寫形式進行查詢。若是不想使用默認的,一樣能夠在定義外鍵的時候,指定參數related_query_name='articles',以後就能夠使用articles進行反向查詢子表了。
2. 父表對子表進行反向引用,默認狀況下能夠經過「子表的名字的小寫形式_set」進行反向引用。若是不想使用默認的這種形式,一樣能夠在定義外嫁的時候指定參數related_name='articles',以後就能夠經過articles進行反向引用了。python

相關文章
相關標籤/搜索