2016-06-15 1 views
0

У меня есть следующие модели:Подсчитать количество вхождений определенных вариантов в моделях

class Team(models.Model): 
    # stuff 
class Event(models.Model): 
    # stuff 
class Award(models.Model): 
    award_type_choices = (
     (1, "some string"), # a lot of these 
     (2, "some other str"), 
    ) 
    award_type = models.CharField(choices=award_type_choices) 
    specific_choices = (
     (1, "some string"), # etc 
     # only a few of these, but all of these can be found inside award_type_choices. 
    ) 

    event = models.ForeignKey(Event) 
    recipients = models.ManyToManyField(Team) 

Я пытаюсь подсчитать/аннотирования количество раз в Team получил награду, которая подходит под specific_choices последовательности , Я могу фильтр команды, которые выиграли награду через этот фрагмент кода:

reversed_choices = dict((v, k) for k, v in Award.specific_choices) 
Team.objects.filter(award__award_type__in=reversed_choices.values()) 

Однако, я не знаю, как я должен подходить считая их. Раньше я использовал Count, F и ExpressionWrapper, но не широко знал, как это сделать сразу с места в карьер.

Я полагал, что я мог подойти к нему, бросив те же параметры, filter в Count объекта, но как только я напечатал его, я понял, что это не будет работать, а именно:

Team.objects.annotate(num_specifics=Count('award__award_type__in=Award.specific_choices')) 

Любая помощь с этим будет оценена.

ответ

0

Я был в состоянии найти некоторые Django документы о Conditional Aggregation, которые помогли мне решить эту проблему.

def most_specifics(): 
    reverse_specs = dict((v, k) for k, v in Award.specific_choices) 
    return Team.objects.annotate(
     c=Sum(
      Case(
       When(award__award_type__in=reverse_specs.values(), then=1), 
       default=0, 
       output_field=PositiveSmallIntegerField(), 
      ) 
     ) 
    ).order_by('-c') 
1
choices = Award.specific_choices.all() 

c = Team.objects.filter(award__award_type__in=choices).count() 
+0

К сожалению, я не думаю, что было достаточно ясно. Я ищу, чтобы «комментировать» каждую команду с полем, в котором сколько раз у них есть «Премия», которая является частью поля «specific_choices». Кроме того, 'specific_choices' - это просто последовательность с корнями int, str' внутри. Не могу называть 'all()' на этом. – Justin

+0

Тогда это просто Team.objects.annotate (num_specifics = c), где c - возвращаемое значение из вышеизложенного. – dmitryro

+0

Это не работает; AFAIK, вы не можете поместить запрос в аннотацию. Кроме того, что это значит, так это то, что многие команды выиграли эти конкретные награды, а не то, сколько побеждало _each_. Я ищу последнего. – Justin

0

После код будет найти несколько вариантов в определенной области данной модели:

my_field=Model._meta.get_field('field_name') 

length=len(my_field.choices._display_map) 

 Смежные вопросы

  • Нет связанных вопросов^_^