J'ai ce modèle:requête Django pour sommer les longueurs de ArrayFields
class Interaction(models.Model):
user = models.ForeignKey(User)
codes = ArrayField(models.CharField(choices=CODE_CHOICES))
et je suis en train de comprendre comment faire l'équivalent de cette requête SQL dans Django:
select user_id, sum(cardinality(codes)) from interaction group by user_id;
- J'ai essayé
extra(select={codes_len':'cardinality(codes)'})
, mais ne peut pasannotate
ouaggregate
sur un champextra
. J'ai essayéannotate(Sum("cardinality('codes')"))
, maiscardinality('codes')
n'est pas un champ sur le modèle. - J'ai étudié l'écriture d'un champ agrégat personnalisé qui combinait
Sum
etcardinality
, mais cela semblait ... fragile. - J'ai découvert dans les documents que
__len
ne fonctionne pas correctement sur unArrayField
, mais pas dans le contexte deannotate(Sum('codes__len'))
. - J'ai exclu le SQL brut car il y a beaucoup d'instructions
WHERE
(omises ici) qui rendent cette requête difficile à reconstruire à la main.
À ce stade, je pense que je n'ai pas d'autre choix que d'ajouter un champ au modèle qui est la longueur du champ codes
et le désordre avec save()
pour le synchroniser.
N'y a-t-il vraiment aucun autre moyen? Est-ce que je manque quelque chose?