![](/img/trans.png)
[英]How to filter queryset based on related objects if it contains data in django
[英]Django filter __contains=queryset?
我在Ubuntu 13.04上使用帶Python 2.7的Django 1.4.3。 我遇到了問題,似乎找不到解決方案。
我有一系列相關模型(通過FK),我需要以一種復雜的方式對其進行過濾。
假設我有一個模型Parts
Car
。 我可以將所有零件作為car.parts_set
。 每個部分都有一個M2M字段excluded_price
到Price
,與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.