簡體   English   中英

Django過濾器__contains = queryset?

[英]Django filter __contains=queryset?

我在Ubuntu 13.04上使用帶Python 2.7的Django 1.4.3。 我遇到了問題,似乎找不到解決方案。

我有一系列相關模型(通過FK),我需要以一種復雜的方式對其進行過濾。

假設我有一個模型Parts Car 我可以將所有零件作為car.parts_set 每個部分都有一個M2M字段excluded_pricePrice ,與related_name='excluded_prices'

如果我創建一個新零件,則需要將價格添加到該零件的excluded_price ,其中每個價格與該汽車相關的其他零件都具有excluded_parts 我正在嘗試創建一個過濾器來幫助我找到這些價格。

本質上,我想要這樣的東西:

parts_set = [part for part in car.parts_set.exclude(pk=new_part.pk)]
Price.objects.filter(excluded_parts__contains=parts_set)

實際上,我想找到所有價格,其中excluded_parts是特定汽車零件的超集(顯然不包括新零件)。

如果“ parts_set”是一系列字符串,我發現了一種不錯的方法。

parts_set = [Q(excluded_parts__contains=part) for part in car.parts_set.exclude(pk=new_part.pk)]
Price.objects.filter(reduce(operator.and_, parts_set))

不幸的是__contains僅適用於帶有LIKE SQL語句的字符串。

Django的ORM中是否有任何功能支持__contains類型過濾器,該過濾器將值視為對象而不是字符串?

如果我正確地遵循了您的問題,則可以通過在查詢集上反復建立約束來做到這一點:

parts_set = car.parts_set.exclude(pk=new_part.pk)
price_qs = Price.objects.all()
for part in parts_set:
    price_qs = price_qs.filter(excluded_parts=part)

這將要求最終查詢集中的價格在其excluded_parts字段中具有parts_set結果中的所有零件。 他們也可以有其他部分。 price_qs應該最終返回您想要的結果:

所有價格,其中exclude_parts是特定汽車零件的超集

我不知道一種構造查詢的更好方法,該查詢要求多對多字段必須包含多個特定值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM