2017-05-31 61 views
1

我需要在Django的下列PostgreSQL語句中創建一個查詢集。如何使用Django的數據庫API建立一個嵌套的查詢

SELECT * FROM 
(
SELECT DISTINCT ON("atech_cars". 
    "model") 
"atech_cars". 
"make", "atech_cars". 
"model", "atech_cars". 
"trim" 
FROM "atech_cars" 
WHERE(UPPER("atech_cars". 
     "make"::text) = UPPER('Ford') AND "atech_cars". 
    "model" 
    IN(SELECT U0. 
     "char_value" 
     AS Col1 FROM "clf_atech_filter_cache" 
     U0 WHERE U0. 
     "filter_id" = 7)) 
) Sub 
ORDER BY 
CASE WHEN ("model" = 'xD') THEN 0 
WHEN ("model" = 'Cayenne') THEN 1 
WHEN ("model" = 'Elantra') THEN 297 ELSE NULL END ASC 

這是我想在queryset結束時生成的查詢。

我已經創建了以下語句的查詢集。

SELECT DISTINCT ON("atech_cars". 
    "model") 
"atech_cars". 
"make", "atech_cars". 
"model", "atech_cars". 
"trim" 
FROM "atech_cars" 
WHERE(UPPER("atech_cars". 
     "make"::text) = UPPER('Ford') AND "atech_cars". 
    "model" 
    IN(SELECT U0. 
     "char_value" 
     AS Col1 FROM "clf_atech_filter_cache" 
     U0 WHERE U0. 
     "filter_id" = 7)) 

因此最終,我正在查找以下語句的queryset。

SELECT * FROM 
(
<Queryset> 
) Sub 
ORDER BY 
CASE WHEN ("model" = 'xD') THEN 0 
WHEN ("model" = 'Cayenne') THEN 1 
WHEN ("model" = 'Elantra') THEN 297 ELSE NULL END ASC 

這裏是查詢集我創建Django的,但它不工作。

class ATechCarModelFilter(Filter): 

    def filter(self, qs, value): 
     # trim filter_id = 9 in atech_filter 
     trims = ClfCacheModel.objects.filter(filter_id = 9).values_list('char_value', flat=True).order_by("counter") 
     preserved = Case(*[When(trim=trim, then=pos) for pos, trim in enumerate(trims)]) 
     return qs.filter(model__iexact = value).filter(trim__in=trims).order_by(preserved) 

這裏,QS是指查詢集BModel

如何建立查詢對象,我已經有嗎?

我在做什麼錯?

這是根據要求的型號

class BModal(models.Model): 
    char_value = models.CharField(max_length=2048, blank=True, null=True) 
    counter = models.IntegerField() 

    class Meta: 
     managed = False 
     db_table = 'filter_cache' 

class AModel(models.Model): 
    make = models.CharField(max_length=200, primary_key=True) 
    model = models.CharField(max_length=200, primary_key=True) 
    trim = models.CharField(max_length=200) 

    class Meta: 
     managed = False 
     db_table = 'amodel' 

這是我想要的。

1)AModel和BModel現在沒有關係。

2)從AModel表中獲取模型列表,然後根據該列表的順序,我想按照BModel中列表的順序排序。

3)在此之後,我想刪除重複項與distint( 「模型」)

更新ATechCarMakeFilter()的註釋:

class ATechCarMakeFilter(Filter): 
    def filter(self, qs, value): 
     # model filter_id = 7 in atech_filter 
     models = ClfCacheModel.objects.filter(filter_id = 7).values_list('char_value', flat=True).order_by("counter") 
     preserved = Case(*[When(model=model, then=pos) for pos, model in enumerate(models)], default=None, output_field=IntegerField()) 
     qs = qs.filter(make__iexact = value).filter(model__in=models).distinct("model")   
     return qs.annotate(ordering=preserved).order_by("-ordering") 
+0

歡迎來到SO。我對你的問題做了一些編輯,希望它們有幫助。總的來說,儘管如此,你的問題是很好的B/C,你可以很好地詳細列出你想要做的一切。如果是我,我會嘗試一個更簡單的查詢來查看是否正確。如果您嘗試更簡單的查詢,並且仍然無法使用嵌套查詢在Django中工作,那麼您可以編輯自己的問題以放入更簡單的查詢,並可能從Django社區獲得更多響應。我本人不是Django的用戶,所以我不會有任何直接的幫助。如果你找到答案,你可以回答自己的問題並接受它。 – WattsInABox

+0

@WattsInABox謝謝 –

+0

Django ORM可以從OOP模型及其關係創建SQL。所以,SQL應該是結果,而不是起點。爲了創建正確的ORM查詢,請提供您的模型,並告訴我們您想從中獲得什麼。 –

回答

0

好吧,我想我明白你要什麼這裏。您可以用您正在查找的案例說明對您的查詢集進行註釋,然後按此順序排序

from django.db.models import Count, Case, When, IntegerField 

class ATechCarModelFilter(Filter): 
    def filter(self, qs, value): 
     qs = ... 
     ... # previous filters 
     qs.annotate(
      ordering=Case(
       When(model='xD', then=0), 
       When(model='Cayenne', then=1), 
       When(model='Elantra', then=297), 
       default=None, 
       output_field=IntegerField() 
      ) 
     ).order_by('-ordering') 
+0

我已經用註釋更新了ATechCarModelFilter。 注意:我更新了更新的'ATechCarModelFilter'描述,但我收到以下錯誤消息。 無法解析表達式類型,未知的output_field。 謝謝 –

+0

啊,我忘了output_field。答案更新 – Brobin

+0

我按照你的要求更新了ATechCarMakeFilter中的過濾器,但得到了同樣的錯誤。更新了描述。 –