반응형
Django 중첩 쿼리
Django에서는 원시 쿼리를 사용하지 않고 다음과 같은 중첩된 SQL 구조를 구현하려고 합니다.
SELECT id,
session_hash,
user_id,
price_type_id,
room_category_id,
check_in_date,
price,
captured_date
FROM (SELECT p.*,
Row_number() OVER (partition BY check_in_date, price_type_id, room_category_id ORDER BY captured_date DESC) AS rn
FROM dashboard_prices p
WHERE room_category_id = 1
AND price_type_id = 1
AND check_in_date >= '2018-01-01 00:00:00'
AND check_in_date <= '2018-01-02 00:00:00') p
WHERE rn = 1
저는 장고에서 "정상적인" 질의 표현을 사용해서 어떻게 그것을 달성해야 하는지 알 수 없었습니다.
모델:
class Prices(models.Model):
session_hash = models.CharField(max_length=32, blank=False, null=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, null=False)
price_type = models.ForeignKey(PriceTypes, on_delete=models.CASCADE, blank=False, null=False)
room_category = models.ForeignKey(RoomCategories, on_delete=models.CASCADE, blank=False, null=False)
check_in_date = models.DateTimeField(blank=False, null=False, db_index=True)
price = models.IntegerField(blank=False, null=False)
captured_date = models.DateTimeField(default=timezone.now, blank=True)
row_number = 'row_number() OVER (PARTITION BY check_in_date, price_type_id, room_category_id ' \
'ORDER BY captured_date DESC)'
다음 방법으로 내부 쿼리를 실행할 수 있게 되었습니다.
price = Prices.objects.annotate(rn=RawSQL(Prices.row_number[]))
.filter(room_category_id=req['room_category_id'], price_type_id=req['price_type_id'],
check_in_date__gte=check_in_date, check_in_date__lte=check_out_date)
그러나 이 후에 필터링하면 오류만 발생합니다.
django.db.utils.DatabaseError: Window function is allowed only in SELECT list and ORDER BY clause
추가 시:
.filter(rn=1)
그것을 달성할 가능성이 있습니까?
감사합니다!
언급URL : https://stackoverflow.com/questions/48137986/django-nested-queries
반응형
'programing' 카테고리의 다른 글
ubuntu에서 기본 python 버전을 python3으로 설정할 수 없습니다. (0) | 2022.09.17 |
---|---|
Python을 단순하게 설정Windows 상의 HTTP 서버 (0) | 2022.09.17 |
PHP에서 레이트 스태틱바인딩이란 정확히 무엇입니까? (0) | 2022.09.16 |
정수를 롱으로 변환 (0) | 2022.09.16 |
물체를 어떻게 파괴합니까? (0) | 2022.09.16 |