Shawn's Blog

Django 中的 F()

0X00 内容比较少,不分标题

我们对Django中的model进行查询时通常是某个字段和一个常量 对比,比如下面这种写法

python
1Student.objects.filter(name='shawn')
2Student.objects.filter(age=233)
3Student.objects.filter(gender__in=('F', 'M'))

如果遇到高级的查询可能会使用Q()查询,不过也只是进行多个条件的查询

python
1Student.objects.filter(
2    Q(name='shawn') | Q(gender='M')
3)
4Student.objects.filter(
5    Q(gender='F') | ~Q(age=233)
6)

这里是我的另一篇介绍Q()的博文。

但是如果有这样一个需求:”查询订单中结束时间和开始时间的间隔大于45分钟的“。那应该怎么办的?因为订单的开始时间和结束时间都是一个字段,我们需要对比同一条数据中的两个字段。这时候可以使用F()来查询。

python
1import datetime
2
3from django.db.models import F
4from my_project.models.Order
5
6forty_five_minutes = datetime.timedelta(minutes=45)
7Order.objects.filter(end_time__gt=F('start_time') + forty_five_minutes) # 查询结束时间大于开始时间加上45分钟的订单
8Order.objects.filter(operator__age__lte=F('client__age'))   # 查询订单操作员年龄小于等于客户的(我也不知道有啥用,例子而已)
9
10one_second = datetime.timedelta(seconds=1)
11OldMan.objects.filter(age__gt=F('age') + one_second)    # 查询年龄比自己年龄多1S的大人?哈哈哈

本段内容的官方文档:https://docs.djangoproject.com/en/2.1/ref/models/expressions/#f-expressions 本段内容的另一篇博客:https://www.cnblogs.com/liuq/p/5946803.html

本文标题
Django 中的 F()
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论