如何编写满足关联模型多OR条件的Django ORM查询语句
你可以通过Django的Q对象构造多条件或逻辑查询,搭配注解或者子查询实现需求,以下是两种可行方案:
方案1:注解+跨表查询(写法简单,适合中小数据量)
首先导入需要的工具:
from django.db.models import Count, Max, Q
查询代码如下:
queryset = Order.objects.annotate( # 统计关联Product总数 products_count=Count('products'), # 统计关联Product的quantity最大值,大于1即代表至少有一个Product满足条件 max_quantity=Max('products__quantity') ).filter( # 三个条件任意满足一个即可 Q(products_count__gt=1) | Q(max_quantity__gt=1) | Q(products__b_product__type='rtProduct') ).distinct()
末尾添加distinct()是为了避免跨表查询时,同一个Order关联多个符合条件的Product导致返回重复实例。
方案2:子查询(性能更优,适合大数据量表)
如果你的业务数据量较大,使用Exists子查询的性能会更高,且不需要额外去重:
from django.db.models import Count, Q, Exists, OuterRef # 提前构造子查询,查询当前Order是否存在符合条件的Product has_quantity_gt1 = Exists( Product.objects.filter(order=OuterRef('pk'), quantity__gt=1) ) has_rt_product = Exists( Product.objects.filter(order=OuterRef('pk'), b_product__type='rtProduct') ) queryset = Order.objects.annotate( products_count=Count('products') ).filter( Q(products_count__gt=1) | has_quantity_gt1 | has_rt_product )
内容的提问来源于stack exchange,提问作者DarK_FirefoX
相关产品推荐
相关产品推荐

