Как устранить дублирование кода в View для фильтрации экземпляров модели
Я пытаюсь понять, как решить, вероятно, очень простой вопрос, но я хотел бы сделать это соответствующим и Django последовательным способом.
Предположим, что у нас есть пример модели:
class ExmapleModel(Model):
vote_up = models.IntegerField(default=0)
vote_down = models.IntegerField(default=0)
def get_voting_count(self):
return self.vote_up - self.vote_down
Ок, и теперь я хочу создать отдельные представления на одном шаблоне для ExmapleModel, который будет иметь, например, количество голосов больше 500 и для всех экземпляров. Конечно, я могу создать что-то вроде:
class ModelListView(ListView):
model = ExmapleModel
template_name = 'ExmapleModel_list.html'
и второй:
class ModelListView(ListView):
model = ExmapleModel
template_name = 'ExmapleModel_list.html'
queryset = ExmapleModel.objects.filter(get_voting_count()>300)
Принимая все вышесказанное, я хотел бы избежать повторения большого количества кода для примера выше, я понятия не имею, как использовать метод get_voting_count() для фильтрации и объединить все эти вещи для рабочего пакета. Если у вас есть идеи, как это совместить, пожалуйста, помогите мне.
С другой стороны, должен ли я использовать эту логику внутри модели?
Решено:
То, что не давало мне спать по ночам, оказалось гораздо проще, чем я думал. Итак, чтобы решить проблему фильтрации по вычисляемым полям, я создал менеджер Model для своей модели и в менеджере добавил фильтр в переменную голосования, как показано ниже:
def get_hot_deal(self, days, hot_result):
voting = F('vote_up') - F('vote_down')
hot_deals = Deal.objects.annotate(rate=voting).filter(
rate__gte=hot_result,
created_at__gte=datetime.date.today() - datetime.timedelta(days)
)
return hot_deals