Python Django:我如何筛选只返回那些已经支付了>=10000
这是我的模特Python Django:我如何筛选只返回那些已经支付了>=10000,python,django-filter,Python,Django Filter,这是我的模特 class Candidate(models.Model): person = models.OneToOneField( Person, related_name='person_candidate', on_delete=models.PROTECT) def __str__(self): return str(self.person)
class Candidate(models.Model):
person = models.OneToOneField(
Person, related_name='person_candidate', on_delete=models.PROTECT)
def __str__(self):
return str(self.person)
@property
def total_candidate_votes(self):
return self.candidate_votes.filter(candidate=self).count()
@property
def amount_paid(self):
return self.candidate_payments.aggregate(models.Sum('fees'))['fees__sum'] or 0
@property
def is_qualified_to_vie(self):
return self.amount_paid >= 10000
帮助我创建一个筛选器,该筛选器将显示仅支付>=10000的候选人
Filter.py
class CandidateFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='iexact', name='person__first_name')
is_qualified_to_vie = django_filters.BooleanFilter(method='filter_by_qualified_candidates')
def filter_by_qualified_candidates(self, queryset, field, value):
return queryset.filter
问题是python属性无法转换为django过滤器表达式。除了这里的python属性之外,我建议使用自定义queryset方法。如下所示:
class CandidateQuerySet(models.QuerySet):
def注释金额(自付):
return self.annotate(amount\u paid=models.Sum('candidate\u payments\u fees'))
def合格到vie(自我,是=真):
#例如,Candidate.objects.qualified_to_vie()
qs=返回自我。注释金额支付()
如果是:
返回数量过滤器(已支付金额=10000)
返回qs.filter(已支付金额=10000)
班级候选人(模型。模型):
...
objects=CandidateQuerySet.as_manager()
从这里开始,这相当简单
class CandidateFilter(filters.FilterSet):
is_qualified_to_vie=django_filters.BooleanFilter(方法='filter_by_qualified_candidates')
def筛选依据符合条件的候选项(自我、查询集、名称、值):
将queryset.qualified_返回到_vie(值)
请注意,以上只是想法的要点,可能需要进行一些更改才能真正发挥作用