I use the following bit of code in my Django app:
pictures = gallery.picture_set.annotate( score=models.Sum( 'picturevote__value' ) ).order_by( '-score' )
There is a table of galleries. In each of them are some pictures. When a user votes up or down a picture, a new row in 'picturevote' is inserted and connected to the picture. Then I can get the total score for the pictures.
Now I want to order the pictures of one gallery by their score values. But due to the table joins there can be the value NULL for score when there were no votes at all. Nevertheless a score of 'NULL' shall be treated as '0'.
Any ideas?
edit:
Okay, here some additional explanation:
The problem is that the aggregation in the above example sets score
to NULL. When I want to display the score I use something like this:
score = self.picturevote_set.aggregate( models.Sum( 'value' ) )[ 'value__sum' ] or 0
Then the aggregation leads either to NULL (if there are no picturevote rows) or a certain value. If it is NULL the or-expression converts it to a displayable integer value.
But this solves just the display problems which are caused by the NULL value.
When I want to sort the pictures by this score
value as in the first code example all entries with NULL are put at the end of the ordered result set. First there are pictures with positive scores, then there are the pictures with negative values and THEN there are the pictures that were not voted up or down so far, because they have NULL as score
.
My question is how this behaviour can be changed so that the order is correct.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…