J'aime effectuer une requête Django comme celle ci-dessous :

query = Dbmodel.objects.all().annotate(result=F('fieldname1') + F('fieldname2') + F('fieldname4'))

Mais au lieu d'utiliser directement les noms de champs, j'aimerais utiliser une liste avec les noms de champs :

fields = ['fieldname1', 'fieldname2', 'fieldname4']

En fonction de l'interaction de l'utilisateur, le nombre de noms de champs dans la liste peut varier. Y a-t-il un moyen de le faire?

Comme il s'agit de ma première question sur StackOverflow, veuillez me le faire savoir si ma question n'est pas claire ou si je pourrais améliorer ma question.

1
mvhee 6 oct. 2020 à 23:04

1 réponse

Meilleure réponse

Vous pouvez le faire en utilisant operator.add pour combiner les multiples expressions F en une seule expression et la transmettre à l'annotation.

Cela ressemblerait à ceci:

import operator
from django.db.models import F

# any amount of fields
fields = ["fieldname1", "fieldname2", "fieldname3"] 

# combine into a single sum
combined_expression = reduce(operator.add, (F(x) for x in fields))

# the new query
query = Dbmodel.objects.all().annotate(result=combined_expression)
2
Ruben Helsloot 7 oct. 2020 à 16:18