gpt4 book ai didi

python - 将 AND 和 OR 与 Q 对象组合的 Django 查询过滤器不返回预期结果

转载 作者:IT老高 更新时间:2023-10-28 22:18:15 26 4
gpt4 key购买 nike

我尝试使用 Q 对象在过滤器中组合 AND 和 OR。看起来 |表现得像一个 AND。这与之前在同一查询中运行的注释有关,而不是作为子查询。

用 Django 处理这个问题的正确方法是什么?

models.py

class Type(models.Model):
name = models.CharField(_('name'), max_length=100)
stock = models.BooleanField(_('in stock'), default=True)
hide = models.BooleanField(_('hide'), default=False)
deleted = models.BooleanField(_('deleted'), default=False)

class Item(models.Model):
barcode = models.CharField(_('barcode'), max_length=100, blank=True)
quantity = models.IntegerField(_('quantity'), default=1)
type = models.ForeignKey('Type', related_name='items', verbose_name=_('type'))

views.py

def hire(request):
categories_list = Category.objects.all().order_by('sorting')
types_list = Type.objects.annotate(quantity=Sum('items__quantity')).filter(
Q(hide=False) & Q(deleted=False),
Q(stock=False) | Q(quantity__gte=1))
return render_to_response('equipment/hire.html', {
'categories_list': categories_list,
'types_list': types_list,
}, context_instance=RequestContext(request))

生成的 SQL 查询

SELECT "equipment_type"."id" [...] FROM "equipment_type" LEFT OUTER JOIN
"equipment_subcategory" ON ("equipment_type"."subcategory_id" =
"equipment_subcategory"."id") LEFT OUTER JOIN "equipment_item" ON
("equipment_type"."id" = "equipment_item"."type_id") WHERE
("equipment_type"."hide" = False AND "equipment_type"."deleted" = False )
AND ("equipment_type"."stock" = False )) GROUP BY "equipment_type"."id"
[...] HAVING SUM("equipment_item"."quantity") >= 1

预期的 SQL 查询

SELECT
*
FROM
equipment_type
LEFT JOIN (
SELECT type_id, SUM(quantity) AS qty
FROM equipment_item
GROUP BY type_id
) T1
ON id = T1.type_id
WHERE hide=0 AND deleted=0 AND (T1.qty > 0 OR stock=0)

编辑:我添加了预期的 SQL 查询(没有设备子类别的连接)

最佳答案

尝试添加括号以明确指定您的分组?正如您已经知道的那样,filter() 的多个参数只是通过底层 SQL 中的 AND 连接。

最初你有这个过滤器:

[...].filter(
Q(hide=False) & Q(deleted=False),
Q(stock=False) | Q(quantity__gte=1))

如果你想要 (A & B) & (C | D) 那么这应该可行:

[...].filter(
Q(hide=False) & Q(deleted=False) &
(Q(stock=False) | Q(quantity__gte=1)))

关于python - 将 AND 和 OR 与 Q 对象组合的 Django 查询过滤器不返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com