zoukankan      html  css  js  c++  java
  • 69.ORM查询条件:isnull和regex的使用

    首先查看数据库中的article表的数据:

    在这里插入图片描述

    定义模型的文件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)
        create_time = models.DateTimeField(auto_now_add=True, 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. isunll:判断某个字段的值是否为空。views.py文件中示例代码如下:

    from django.http import HttpResponse
    from .models import Article
    
    
    def index2(request):
        # 1.isnull: 查找创建时间create_time是空的文章
        articles = Article.objects.filter(create_time__isnull=True)
        print(articles)
        print(articles.query)
        
        # 2. isnull: 同样,也可以查找create_time非空的文章
        article = Article.objects.filter(create_time__isnull=False)
        print(article)
        print(article.query)
        return HttpResponse('success!')
    

    2.regex:大小写敏感的判断某字段的值是否满足正则表达式的条件;iregex:大小写不敏感的判断的判断某字段的值是否满足正则表达式的条件。示例代码如下:

    def index2(request):
        # 3.regex大小写敏感的正则表达式,
        # 判断以hello开头的字符串
        articles = Article.objects.filter(title__regex=r'^hello')
        print(articles)
        print(articles.query)
    
        # 4.iregex大小写敏感的正则表达式
        # 判断以hello开头的字符串
        articles = Article.objects.filter(title__iregex=r'^hello')
        print(articles)
        print(articles.query)
        return HttpResponse('success!')
    
    打印出结果:

    <QuerySet []>,返回的QuerySet为空。

    SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article WHERE article.title REGEXP BINARY ^hello,需要注意的是,这里django底层执行的sql语句为BINARY 即代表的是区分大小写进行判断。

    <QuerySet [<Article: <(Article: id: 1,title: Hello, content: 你好)>>, <Article: <(Article: id: 2,title: Hello World, content: 大家好)>>]>,返回两条满足正则表达式的数据。

    SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article WHERE article.title REGEXP hello,这里执行的sql语句为正则表达式匹配hello,并不区分大小写。

    根据关联表进行查询:

    两个关联的模型之间可以相互查询,在以下实例中,category为父模型,article模型为子模型,category访问article表,可以通过默认的子模型的名字小写形式进行访问article表。如果不想使用默认的方式进行访问,可以通过在定义外检的时候,指定related_query_name的值来自定义方式。
    def index3(request):
        # 查找文章题目中包含中国的文章分类
        # 注意:contains区分大小写判断某字段中的值是否包含某个值
        # 在被翻译成了sql语句的时候会被翻译成LIKE BINARY.
        category = Category.objects.filter(article__title__contains='中国')
        print(category)
        print(category.query)
        return HttpResponse("success!")
    
    打印出结果:

    <QuerySet [<Category: Category object (3)>]>

    SELECT category.id, category.name FROM category INNER JOIN article ON (category.id = article.category_id) WHERE article.title LIKE BINARY %中国%

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    模板方法模式
    Centos 6.4 python 2.6 升级到 2.7
    Python 在Visual studio 中做单元测试进行TDD开发
    C# 代码转换到Python
    VMware Network Adapter VMnet1和VMnet8 未识别的网络的解决方法
    Visual Studio 启动加速
    查询Sqlserver 表结构信息 SQL
    HTTP发送请求模拟
    【Xamarin 开发 IOS --使用 Storyboard Segue 实作 UIViewController 的切换 (实例)】
    【Xamarin 开发 IOS --IOS 页面导航概念Segue】
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12264539.html
Copyright © 2011-2022 走看看