我需要在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")
歡迎來到SO。我對你的問題做了一些編輯,希望它們有幫助。總的來說,儘管如此,你的問題是很好的B/C,你可以很好地詳細列出你想要做的一切。如果是我,我會嘗試一個更簡單的查詢來查看是否正確。如果您嘗試更簡單的查詢,並且仍然無法使用嵌套查詢在Django中工作,那麼您可以編輯自己的問題以放入更簡單的查詢,並可能從Django社區獲得更多響應。我本人不是Django的用戶,所以我不會有任何直接的幫助。如果你找到答案,你可以回答自己的問題並接受它。 – WattsInABox
@WattsInABox謝謝 –
Django ORM可以從OOP模型及其關係創建SQL。所以,SQL應該是結果,而不是起點。爲了創建正確的ORM查詢,請提供您的模型,並告訴我們您想從中獲得什麼。 –