如何解决视图中用于模型实例过滤的代码重复问题
How to resolve code duplication in View for model instances filtering
我试图弄清楚如何解决可能是一个非常简单的问题,但我想以一种适当且与 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() 方法来过滤和组合所有这些东西工作包。如果您对如何组合它有任何想法,请帮助我。
另一方面,我应该在模型中使用这个逻辑吗?
已解决:
让我夜不能寐的事情比我想象的要简单得多。所以基本上为了解决计算字段的过滤问题,我为我的模型创建了一个模型管理器,在管理器中,我在投票变量中添加了一个过滤器,如下所示:
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
我试图弄清楚如何解决可能是一个非常简单的问题,但我想以一种适当且与 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() 方法来过滤和组合所有这些东西工作包。如果您对如何组合它有任何想法,请帮助我。
另一方面,我应该在模型中使用这个逻辑吗?
已解决:
让我夜不能寐的事情比我想象的要简单得多。所以基本上为了解决计算字段的过滤问题,我为我的模型创建了一个模型管理器,在管理器中,我在投票变量中添加了一个过滤器,如下所示:
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