【问题标题】:Django - query for to give rows where one column Not equals to another column in same modelDjango - 查询给出一列不等于同一模型中另一列的行
【发布时间】:2014-01-28 03:30:00
【问题描述】:

我的模型有 3 个字段

class Table(models.Model):
    in_time = models.DateTimeField(null=True, blank=True) 
    actual_time = models.DateTimeField(null=True, blank=True)

我想以这种方式获取结果:

select * from Table where in_time > '2013-12-31 00:00:00' and in_time != actual_time

那么谁能帮我完成这个

result = Table.objects.filter(in_time__gte = '2013-12-31 00:00:00')

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    您要搜索的是:

    https://docs.djangoproject.com/en/dev/topics/db/queries/#filters-can-reference-fields-on-the-model

    解决方案

    from django.db.models import F
    from datetime import datetime
    
    min_date = datetime(2013,12,31)
    result = Table.objects.filter(in_time__gte=min_date).\
    exclude(in_time__eq=F('actual_time'))
    

    【讨论】:

      【解决方案2】:

      使用Q~ 运算符来构建否定(NOT)查询:

      import datetime
      from django.db.models import Q, F
      
      Table.objects.filter(~Q(in_time=F('actual_time')),
                           in_time__gt=datetime.datetime(2013,12,31))
      

      F 引用同一模型上的字段:

      Django 提供了 F 表达式来允许这样的比较。的实例 F() 充当对查询中模型字段的引用。这些 然后可以在查询过滤器中使用引用来比较 同一模型实例上的两个不同字段。

      【讨论】:

      • @ProfHase85 使用排除过滤器和使用 Q 类过滤在性能上有什么区别?
      • 对不起,我的错,只是弄错了。没有明显的性能差异。仍然为查询初始化一个额外的类(如果有一种方法可以在没有 Q 类的情况下执行此操作)似乎很麻烦。 (但这只是口味问题)
      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 2017-08-10
      • 2015-07-31
      • 2022-10-06
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2020-07-09
      相关资源
      最近更新 更多