首页 > 其他分享 >Django中的__(双下划线)

Django中的__(双下划线)

时间:2024-11-21 19:18:00浏览次数:1  
标签:__ Product 下划线 Django filter objects fieldname 查找

在Django中,双下划线(__)在查询操作中有着非常重要的作用,尤其是与 查询过滤(filter) 和 字段查找(lookup) 相关的操作。它可以让你进行跨字段查询、字段的精确查找、以及其他复杂的查询操作。

1. 基本用法:字段查找(Lookup)

Django 使用双下划线(__)来表示各种字段查找操作,它通常用于 filter()exclude()get() 等查询方法中。

比如:

# 例如,假设有如下的模型:
class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

# 查询价格大于100的所有产品
products = Product.objects.filter(price__gt=100)

# 查询所有名称包含"phone"的产品
products = Product.objects.filter(name__icontains="phone")

# 查询创建日期在某个范围内的产品
products = Product.objects.filter(created_at__gte='2024-01-01', created_at__lt='2024-12-31')

# 查询与某一类别相关联的所有产品
products = Product.objects.filter(category__name="Electronics")
  • 第一个查询返回价格大于100的所有产品。

  • 第二个查询返回所有名称包含 "phone" 的产品(不区分大小写)。

  • 第三个查询返回创建日期在2024年1月1日到2024年12月31日之间的所有产品。

  • 第四个查询返回所有属于类别 "Electronics" 的产品。

每个查询返回的都是一个 QuerySet,即一组符合查询条件的模型实例,允许你进一步操作和迭代这些结果

2. 字段查找的种类

__后面跟的部分是查找类型(lookup),它指示了如何进行过滤、查询或者比较。Django 提供了多种字段查找类型:

(1) 精确匹配

fieldname__exact: 查找精确匹配的字段值

Product.objects.filter(name__exact="iPhone")

查询名称正好是 iPhone 的产品。

(2) 大小写不敏感匹配

fieldname__iexact: 查找不区分大小写的精确匹配。

Product.objects.filter(name__iexact="iphone")

查询名称为 iphone 或者 IPHONE(不区分大小写)等的产品。

(3) 包含关系

  • fieldname__contains: 查找字段值中包含某个字符串。

    Product.objects.filter(name__contains="phone")
    

    查询名称中包含 phone 的所有产品。

  • fieldname__icontains: 不区分大小写的包含查询。

    Product.objects.filter(name__icontains="phone")
    

(4) 开头和结尾匹配

  • fieldname__startswith: 查找以指定字符串开头的字段值。

    Product.objects.filter(name__startswith="iP")
    
  • fieldname__istartswith: 不区分大小写的开头匹配。

    Product.objects.filter(name__istartswith="ip")
    
  • fieldname__endswith: 查找以指定字符串结尾的字段值。

    Product.objects.filter(name__endswith="Phone")
    
  • fieldname__iendswith: 不区分大小写的结尾匹配。

    Product.objects.filter(name__iendswith="phone")
    

(5) 数值比较

  • fieldname__gt: 大于指定值(Greater Than)。

    Product.objects.filter(price__gt=100)
    
  • fieldname__gte: 大于等于指定值(Greater Than or Equal To)

    Product.objects.filter(price__gte=100)
    
  • fieldname__lt: 小于指定值(Less Than)。

    Product.objects.filter(price__lt=100)
    
  • fieldname__lte: 小于等于指定值(Less Than or Equal To)。

    Product.objects.filter(price__lte=100)
    
  • fieldname__exact: 查找完全等于某个值(精确匹配)。

    Product.objects.filter(price__exact=200)
    

(6) 范围查找

  • fieldname__range: 查找某个字段值在指定范围内的记录。

    Product.objects.filter(price__range=(100, 500))
    

该范围是 闭区间,意味着 包括 范围的两端值。

(7) 日期和时间查找

  • fieldname__date: 查找某日期字段的日期部分。

    Product.objects.filter(created_at__date="2024-01-01")
    
  • fieldname__year, fieldname__month, fieldname__day:按年、月、日查找。

    Product.objects.filter(created_at__year=2024)
    
  • fieldname__week_day: 查找某日期字段的星期几(1表示星期一,7表示星期天)。

Product.objects.filter(created_at__week_day=2)  # 查找创建日期是星期二的产品

3. 关系查找:跨越外键关系

Django 的双下划线还支持跨越模型之间的外键关系进行查询。你可以使用双下划线来访问外键模型的字段。

比如:

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

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

# 查找某一类别下所有价格大于100的产品
products = Product.objects.filter(category__name="Electronics", price__gt=100)

这里使用了 category__name 来访问与 Product 相关联的 Category 模型中的 name 字段。

4. 总结:__ 双下划线的作用

  • 字段查找:双下划线用于在查询中执行各种条件过滤操作,比如精确匹配、模糊匹配、范围查找等。

  • 跨模型查询:通过 __,你可以跨越模型之间的外键关系来查询相关字段的值。

  • 日期时间查找:它也可以用于对日期字段的年、月、日等进行查询。

Django 的双下划线使得查询功能非常强大,可以实现复杂的查询条件和跨模型的数据访问。

标签:__,Product,下划线,Django,filter,objects,fieldname,查找
From: https://www.cnblogs.com/hisun9/p/18561372

相关文章

  • P7906 [Ynoi2005] rpxleqxq 题解
    P7906[Ynoi2005]rpxleqxq题解题目大意给定一个长度为\(n\)的序列\(A\),和一个常数\(k\)。有\(m\)次询问,每次给定一个区间\([l,r]\),询问有多少二元组\((i,j)\),满足:\(1\leqi<j\leqn\);\((A_i\oplusA_j)\leqk\)。Solve前置知识:莫队二次离线。对于普通莫队,端......
  • 掘金量化策略运行时,如何防止程序中断导致的数据丢失?
    背景掘金量化策略运行时,有些客户需要将电脑带回家/带去上班,或者遇到断网、断电、电脑更新等情况导致的关机等,策略就需要重新启动,但启动后历史数据就缺失了,尤其是一些更策略有关的变量,例如实盘交易的开仓时间,持仓周期,持仓以来最高点/最低点等自定义信息。那有这种需求的时候,就......
  • Linux下 GDB调试器的使用
    文章目录1.可执行程序的Debug版和Release版区别一、编译选项与目的二、性能与体积三、功能与特性四、查看可执行文件2.GDB相关命令GDB常用命令1.可执行程序的Debug版和Release版区别一、编译选项与目的Debug版:编译选项:通常使用包含调试信息的编译选项,如/MDd......
  • 【DP优化技巧】1. Max类DP
    有的时候在遇到问题时,不妨换一个角度,100%不会吃亏\[\begin{align*}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&----LYJ\end{align*}\]有时,在想办法优化DP时,如果遇到了一些像\(A\)和......
  • Nature-Chat润色指令——ChatGPT帮助我完成学术写作的三种方法
    https://mp.weixin.qq.com/s/ppszMUR6TvW_mmpQg4UQCAhttps://ziuch.com/article/three-ways-chatgpt-helps-me-in-my-academic-writing2024年4月8日,《Nature》刊发的专栏文章《ThreewaysChatGPThelpsmeinmyacademicwriting》引发了学界广泛关注。作为《Personalityand......
  • JAVA 静态代理 & 动态代理
    Java中,代理模式是一种常见的设计模式,用于为某对象提供一种代理,以控制对该对象的访问。根据代理类的实现方式,可以分为静态代理和动态代理。以下将分别介绍这两种方式,并进行对比分析。静态代理静态代理是指在编译时期就已经确定了代理类的实现。代理类需要实现与目标对象相同的接......
  • 21~23集训测试题总结
    23集训测试题(10.8)密码锁这题数据量较小,可以直接暴力枚举所有密码情况并一一判断暴力代码#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;structL{intstate[6];booloperator<(constL&b)const{for(inti......
  • 35. TCP网络编程
    一、TCP协议简介1.1、什么是TCP协议  TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序达到。TCP协议会通过3次握手建立可靠连接。然后需要对每个IP包进行编号,确保对方按顺序收到,如果包丢了,就自动重发。一个TCP报文来了以......
  • [CSP-S2019]Emiya 家今天的饭 题解
    题意分析给出一个矩阵,要求每行只能选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数考场思路考虑暴力枚举每一个点的选择情况,最后统计答案。对于行:但是因为有每一行只能选择一个的限制,所以考虑当前行选择一个后直接转跳到下一行......
  • [NOIP2016 提高组] 蚯蚓 题解
    考场思路考虑要动态维护最大值,可以直接使用优先队列进行维护,但是,考虑到我们并不好直接修改优先队列中的每一个元素,所以决定使用vector先排一遍序,再使用冒泡排序进行动态维护,时间复杂度\(O(mn)\),可以拿35pts。代码#include<iostream>#include<vector>#include<algorithm>......