zoukankan      html  css  js  c++  java
  • 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进行反向引用了。

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    创建对象的模式
    linux下安装node v12.16.3
    es6知识点总结
    在阿里云上部署的node服务器不能通过公网IP访问
    angular 1 input中选中状态绑定
    让一个元素水平垂直居中
    语录收集
    跨域
    事件循环
    git的常用命令
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12261764.html
Copyright © 2011-2022 走看看