[英]Django, Python - How do I create a field where the user can only choose a number between 10000 and 100000?
[英]Django: How do i filter to return only those candidates that have paid >=10000
這是我的模型
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 annotate_amount_paid(self):
return self.annotate(amount_paid=models.Sum('candidate_payments__fees'))
def qualified_to_vie(self, yes=True):
# eg, Candidate.objects.qualified_to_vie()
qs = return self.annotate_amount_paid()
if yes:
return qs.filter(amount_paid__gte=10000)
return qs.filter(amount_paid__lt=10000)
class Candidate(models.Model):
...
objects = CandidateQuerySet.as_manager()
從這里開始,這非常簡單。
class CandidateFilter(filters.FilterSet):
is_qualified_to_vie = django_filters.BooleanFilter(method='filter_by_qualified_candidates')
def filter_by_qualified_candidates(self, queryset, name, value):
return queryset.qualified_to_vie(value)
請注意,以上內容只是該思想的要旨,可能需要進行一些更改才能真正起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.