programing

Django 중첩 쿼리

bestcode 2022. 9. 17. 10:45
반응형

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

반응형