2011-05-12 5 views
0

django order_by 값이 데이터베이스에 저장되지 않았습니다.

class Rating(models.Model): 
    upvotes = models.IntegerField(default=0) 
    downvotes = models.IntegerField(default=0) 
    @property 
    def total(self): 
     return self.upvotes - self.downvotes 
class Rating(models.Model): 
    upvotes = models.IntegerField(default=0) 
    downvotes = models.IntegerField(default=0) 
    @property 
    def total(self): 
     return self.upvotes - self.downvotes 

total 속성으로 주문해야하는 등급 그룹이 있습니다. 보시다시피 가 아닌 값이 데이터베이스에 저장됩니다. rating_set.order_by("total")가 작동하지 않습니다.

파이썬의 sorted 함수를 key=lambda r: r.total과 함께 등급 목록에 사용할 수 있습니다. 하지만 이것은 다소 비효율적이며 Django 내에서 더 나은 방법이 존재할 것입니다.

장고는 파생 값에 의한 정렬을 지원합니까? 합계를 데이터베이스에 저장된 값으로 만들어 성능을 향상시킬 수 있습니까?

+0

'.extra()'를 사용하면 쿼리 세트를 렌더링하는 동안 문제가 해결됩니다. 필드는 데이터베이스에서 반환되므로 정렬 할 수 있습니다 (분명히). 나는 그것이 다르게 할 수 있으면 의심한다. – Konstant

답변

1

데이터베이스에 total 속성에 대한 정보가 없기 때문입니다. 파이썬에서만 존재합니다. extra을 사용하여 데이터베이스에서 계산되고 정렬되도록 동일한 동작을 복제 할 수 있습니다. 마찬가지로 :

+0

감사합니다. 나는 실제로'Rating'에 대한 ForeignKey를 가진'Comment' 모델을 가지고 있습니다. 나는 총평으로 코멘트를 정렬하는 방법을 알아 내려고 노력하고있다. 예를 들어'Comments.objects.order_by ("rating__total")'. 나는 이런 식으로 생각하고 있는데, SQL을 알아낼 수 없다. Comments.objects.extra (select = { 'rating_total': "rating.upvotes - rating.downvotes"}). order_by ('- rating_total')' – Ponkadoodle

+0

신경 쓰지 마라, 나는 SQL을 알아 냈다. 'SELECT projects_rating.upvotes - projects_rating.downvotes FROM projects_rating WHERE projects_rating.id = rating_id' – Ponkadoodle

관련 문제