簡體   English   中英

Django:如何過濾以僅返回已支付> = 10000的那些候選人

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM