2017-12-13 1 views
0

두 개의 쿼리 세트를 결합하거나 더 나은 방법으로 특정 사례에 대한 사례/경우 구문을 사용하여 하나만 만듭니다.사례를 사용하는 Queryset 필터/필드 값이 아닌 모델 필드의 경우

저는 documentation에서 queryset 필터링에 사용할 수 있다는 것을 보았습니다. 정확하게 필요한 것뿐 아니라 주석 처리도 가능합니다. 그러나 필드/필드의 값이 아닌 모델 필드 자체에 대해 Case/When를 사용하고 싶습니다.

프로젝트는 전자 상거래이기 때문에 장고 오스카를 사용하므로 여기에 모델을 게시하는 데 큰 도움이됩니다. 알아야 할 것은 바구니 라인이 제품을 의미하고 제품이 부모, 자식 또는 독립형 중 하나 일 수 있다는 것입니다. 그것은 독립형 제품에 관한 경우 (갖는 반면에, I가 필터링해야하는 필드, product__parent__product_class__track_stock 인 바구니 라인 아이되는 제품에 관한 경우

self.in_stock_lines = basket.lines.filter(product__product_class__track_stock=True, is_customized=False) 

것은이있다 : 여기

내 코드 부모가 아님), 내 첫 번째 쿼리 세트와 마찬가지로 product__product_class__track_stock으로 유지됩니다.

이 방법이 있습니까? 아니면 선택의 여지가 있지만 예를 들어 itertools.chain()을 사용하여 두 개의 쿼리 세트를 결합 할 수 있습니까?

+0

또한 모델을 게시하십시오. ..... 또한 mptt를 살펴보면 찾고있는 것을 달성하기가 더 쉬울 수도 있습니다. 제품 생산 제품을 가지고있을 때 어떻게됩니까? ... https://github.com/django-mptt/django-mptt – Walucas

+0

제 질문을 편집했습니다. 모델을 너무 커서 여기에 게시 할 수 없습니다. 전자 상거래). 그러나 제품의 제품으로 된 제품은 존재할 수 없으며, 그것은 부모/자식 관계 또는 독립형 (그 자체로)에 선다. – gamabounta

답변

1

Q 개체를 사용할 수 있습니다.

from django.db.models import Q 

basket.lines.filter(
    Q(product_parent__isnull=True, product__product_class__track_stock=True) | 
    Q(product__parent__product_class__track_stock=True), is_customized=False) 
+1

잘 작동합니다. 고마워요! – gamabounta

관련 문제