Django - аннотировать наиболее часто встречающееся поле, взятое из другой модели, связанной с foreignKey

4 У меня есть модель пользователей и модель с опросом, в которой пользователи выражают свое мнение голосованием с целым числом, определяющим определенный цвет глаз. Пользователь srcID описывает цвет глаз пользователя dstID в соответствии со своим мнением. Пользователь может голосовать сам. Возможно, что пользователь не получил ни одного голоса, поэтому не существует кортежа с dstID, равным его ID. Целое число eyeColor рапределяет определенный цвет, например:

  • 1 => голубые глаза

  • 2 => светло-голубые глаза

  • 3 => карие глаза

  • 4 => зеленые глаза

  • ecc.

     class user:
          userID = models.AutoField(primary_key = True, auto_created = True, unique = True)
          name = models.CharField(max_length=100)
    
      class survey:
          srcID = models.ForeignKey(user, on_delete = models.CASCADE, related_name='hookSrc')
          dstID = models.ForeignKey(user, on_delete = models.CASCADE, related_name='hookDst')
          eyesColor= models.IntegerField()
    

Моя цель - аннотировать в модели пользователя наиболее часто голосуемый тип цвета глаз, чтобы цвет глаз, который другие люди считают цветом глаз этого пользователя. Если пользователь не получил ни одного голоса, я хочу аннотировать 0. В случае, если есть несколько цветов с одинаковой частотой голосования, если пользователь проголосовал сам (кортеж с srcID = dstID) и его голос присвоен одному из наиболее часто голосующих eyesColor, то он имеет приоритет и будет выбран. Запрос, который я хочу получить, похож на то, что я показал ниже:

value = user.objects.annotate(eyesColorMostFreq = ?)

Я хочу аннотировать eyesColorMostFreq к пользовательской модели, чтобы впоследствии манипулировать ею. Как я могу это сделать? Спасибо за все.

Это должно дать наиболее часто встречающийся цвет глаз для каждого пользователя.

subquery = Subquery(survey.objects.filter(srcID=OuterRef('pk').values('eyesColor').annotate(votes=Count('eyesColor')).values('votes').order_by('-votes')[1:])
user.objects.annotate(eyesColorMostFreq=subquery)

Это уже тяжелый запрос, поэтому я не думаю, что это хорошая идея - выбирать цвет, за который проголосовал пользователь, когда несколько цветов имеют одинаковое количество голосов. Скажите мне, если это необходимо, в таком случае я добавлю это

Вернуться на верх