문제

django queryset 객체를 사용 하여이 쿼리를 다시 작성하는 방법이 있습니까?

SELECT b.created_on, SUM(a.vote)
FROM votes a JOIN votes b ON a.created_on <= b.created_on
WHERE a.object_id = 1
GROUP BY 1

투표는 표이면, Object_id는 여러 번 발생하는 int입니다 (외국 키 - 여기서는 중요하지 않음) 및 datetime 인 Create_on입니다.

fwiw,이 쿼리는 해당 Object_id에 대한 모든 이전 투표를 요약함으로써 과거에 언제라도 점수를 얻을 수 있습니다.

도움이 되었습니까?

해결책

Django Orm으로 쿼리를 만들 수 없다고 확신합니다. 새로운 Django Aggregation Code는 매우 유연하지만 원하는 것을 정확하게 할 수는 없다고 생각합니다.

쿼리가 작동하는지 확실합니까? B.Object_id가 1이라는 점검을 놓치고있는 것 같습니다.

이 코드는 작동해야하지만 한 줄 이상이며 효율적이지는 않습니다.

from django.db.models import Sum

v_list = votes.objects.filter(object__id=1)

for v in v_list:
    v.previous_score = votes.objects.filter(object__id=1, created_on__lte=v.created_on).aggregate(Sum('vote'))["vote__sum"]

집계는 트렁크에서만 사용할 수 있으므로이 작업을 수행하기 전에 Django 설치를 업데이트해야 할 수도 있습니다.

다른 팁

집계는 문제가되지 않습니다. 여기서 문제는 Django의 ORM이 단순히 외국인이 아닌 Afaik에 합류하지 않는다는 것입니다.

이것이 제가 지금 사용하고있는 것입니다. 아이러니하게도, SQL은 고장 났지만 이것이 요점입니다.

    def get_score_over_time(self, obj):
    """
    Get a dictionary containing the score and number of votes 
    at all times historically
    """
    import pdb; pdb.set_trace();
    ctype = ContentType.objects.get_for_model(obj)
    try:
        query = """SELECT b.created_on, SUM(a.vote)
                        FROM %s a JOIN %s b 
                        ON a.created_on <= b.created_on
                        WHERE a.object_id = %s
                        AND a.content_type_id = %s
                        GROUP BY 1""" % (
            connection.ops.quote_name(self.model._meta.db_table),
            connection.ops.quote_name(self.model._meta.db_table),
            1,
            ctype.id,
            )
        cursor = connection.cursor()
        cursor.execute(query)
        result_list = []
        for row in cursor.fetchall():
            result_list.append(row)
    except models.ObjectDoesNotExist:
        result_list = None
    return result_list
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top