代码之家  ›  专栏  ›  技术社区  ›  Vémundr

在Django把~Q和F结合起来?

  •  0
  • Vémundr  · 技术社区  · 8 年前

    查询

    Balance.objects.filter(~Q(fax_date=F('paused_date')))
    

    进行了这样的测试:

            deals = Deal.objects.all()
            balance_pre = Balance.objects.filter(~Q(fax_date=F('paused_date')), fax_date__isnull=False, reserved=False)
            agr_nums = list(deals.filter(agr_name__isnull=False).values_list('agr_name', flat=True).distinct())
            agrs_with_fax = 0
    
            for agr_num in agr_nums:
                try:
                    balance_agr = Balance.objects.get(number__icontains=agr_num)
                    if balance_agr.fax_date is not None and balance_agr.fax_date != balance_agr.paused_date and not balance_agr.reserved:
                        agrs_with_fax += 1
                except Balance.DoesNotExist:
                    pass
            agrs_with_fax2 = 0
    
            for agr_num in agr_nums:
                try:
                    balance_pre.get(number__icontains=agr_num)
                    agrs_with_fax2 += 1
                except Balance.DoesNotExist:
                    pass
    
            r = [agrs_with_fax, agrs_with_fax2, balance_agr.fax_date, balance_agr.paused_date, balance_agr.reserved]
    

    返回的r是

    [55, 0, datetime.date(2018, 7, 11), None, False]
    

    1 回复  |  直到 8 年前
        1
  •  1
  •   edilio    8 年前

    我在一个新项目中创建了一个平衡模型,只是为了测试print(qs.query)在本例中是否会显示生成的查询(并非所有情况下)。我也用过 exclude 正如@daniel roseman建议证明他们是等价的。我希望这对你有帮助。

    >>> from django.db.models import F, Q
    >>> qs = Balance.objects.filter(~Q(fax_date=F('paused_date')))
    >>> print(qs.query)
    SELECT "so_balance"."id", "so_balance"."fax_date", "so_balance"."paused_date" 
    FROM "so_balance" WHERE NOT ("so_balance"."fax_date" = 
    ("so_balance"."paused_date"))
    >>> qs = Balance.objects.exclude(fax_date=F('paused_date'))
    >>> print(qs.query)
    SELECT "so_balance"."id", "so_balance"."fax_date", "so_balance"."paused_date" 
    FROM "so_balance" WHERE NOT ("so_balance"."fax_date" = 
    ("so_balance"."paused_date"))