2017-02-22 5 views
0

を支払っただけで候補者を返すようにフィルタリングしないことジャンゴ:どのように私はここ> = 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 を支払った候補が表示されますフィルタを作成するのに役立ち、私のmodel.pyです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 

答えて

0

問題は、pythonのプロパティをdjangoフィルタ式に変換できないということです。ここでは、Pythonプロパティに加えて、カスタムクエリーセットメソッドを使用することをお勧めします。以下のようなもの:

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() 

ここからは、かなり簡単です。

上記はアイデアの要点に過ぎず、実際に機能するには多少の変更が必要になることに注意してください。

関連する問題