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