Я использую следующий фрагмент кода в моем приложении Django:Treat NULL как «0» в Django модели
pictures = gallery.picture_set.annotate(score=models.Sum('picturevote__value')).order_by('-score')
Существует таблица галерей. В каждой из них есть несколько фотографий. Когда пользователь голосует вверх или вниз по картинке, новая строка в «picturevote» вставлена и подключена к изображению. Затем я могу получить общий балл для фотографий. Теперь я хочу заказать фотографии одной галереи по их значениям. Но из-за объединения таблиц может быть значение NULL для оценки, когда не было голосов вообще. Тем не менее оценка «NULL» будет считаться «0».
Любые идеи?
редактировать: Хорошо, вот некоторые дополнительные объяснения: Проблема заключается в том, что агрегация в приведенном выше примере устанавливает score
в NULL. Когда я хочу, чтобы отобразить счет я использую что-то вроде этого:
score = self.picturevote_set.aggregate(models.Sum('value'))[ 'value__sum' ] or 0
Затем агрегирование приводит либо к NULL (если нет picturevote строк) или определенное значение. Если он равен NULL, выражение or преобразует его в отображаемое целочисленное значение. Но это решает только проблемы с отображением, вызванные значением NULL. Когда я хочу сортировать фотографии по этому значению score
, как в первом примере кода все записи с NULL помещаются в конец упорядоченного набора результатов. Сначала есть фотографии с положительными оценками, тогда есть изображения с отрицательными значениями, и ТОГДА есть фотографии, которые не были проголосованы вверх или вниз, потому что у них есть NULL как score
.
Мой вопрос заключается в том, как это поведение можно изменить, чтобы порядок был правильным.
Можете уточнить, в чем проблема?Получаете ли вы ошибку из приведенного выше кода, если нет голосов? Какая ошибка? –