Я пишу приложение Django, в котором есть модель для людей, и я столкнулся с проблемой. Я назначаю объекты ролей людям, использующим отношение «многие ко многим», где роли имеют имя и вес. Я хочу упорядочить свой список людей по весу их самой тяжелой роли. Если я сделаю People.objects.order_by ('- role__weight'), то получу дубликаты, когда людям назначено несколько ролей.
Моя первоначальная идея состояла в том, чтобы добавить денормализованное поле с именем heavymost-role-weight - и отсортировать по нему Это может быть обновлено каждый раз, когда новая роль добавляется или удаляется от пользователя. Однако оказывается, что нет способа выполнить пользовательское действие каждый раз, когда ManyToManyField обновляется в Django ( пока , в любом случае).
Итак, я подумал, что мог бы тогда пойти полностью за борт и написать настраиваемое поле, дескриптор и менеджер, чтобы справиться с этим - но это кажется чрезвычайно трудным, когда ManyRelatedManager создается динамически для ManyToManyField.
Я пытался придумать какой-нибудь умный SQL, который мог бы сделать это для меня - я уверен, что это возможно с подзапросом (или несколькими), но я буду беспокоиться о том, что он не будет совместим, Бэкэнды базы данных поддерживает Django.
Кто-нибудь делал это раньше - или есть идеи, как этого достичь?