我try 使用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))

resulting SQL query

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

expected SQL query

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)

EDIT:我添加了预期的SQL查询(在Equipment_Subategory上没有连接)

推荐答案

好的,在这里和#Django上都没有成功.所以我 Select 使用原始SQL查询来解决这个问题…

以下是工作代码:

types_list = Type.objects.raw('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) 
    ')

Django相关问答推荐

Django、htmx删除记录并更新

Django Model邮箱字段是必需的,即使在我将其设置为NULL=True和BLACK=True之后也是如此

Django没有';t显示黄页

当使用django-tinymce时,我在哪里指定referer?

通过父模型查询子对象-Django

django-filter compose 过滤的 url

Docker 中的 Django检测到更改...,正在重新加载错误

在 Django 4.1 中提交表单之前显示数据

Pytest-django - 测试创建和传递所需的用户对象

Django 模型 Select - 只允许管理界面上的特定转换

设置 SECURE_HSTS_SECONDS 可以不可逆转地 destruct 您的网站?

Django模型中的密码字段

直接在Django的模板中访问ForeignKey

django 在 ubuntu 中安装在哪里

Django删除查询集的最后五个以外的所有内容

UnicodeDecodeError:asciicodec can't decode byte 0xe0 in position 0: ordinal not in range(128)

在 Django REST Framework 中找不到资源时如何返回 404

Python - 覆盖 __init__ 的最干净方法,其中在 super() 调用之后必须使用可选的 kwarg?

Django - 在设置中使用反向 url 映射

如何获取 Django 模型字段对象的值