Как устранить дублирование кода в 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
Вернуться на верх