2010-08-28 4 views
18

Je veux ajouter une valeur statique aux résultats d'une requête de base de données à l'aide django (donc ne pas utiliser SQL « brute »)django d'annotation statique

Par exemple, si j'ai un objet voiture avec des champs marque, modèle, et la couleur, je veux que mes résultats définis avec la valeur statique supplémentaire pour ressembler à quelque chose comme ceci:

make  model  color sales 
----  -----  ----- ----- 
nissan bluebird black 0 
ford  fiesta red  0 
toyota camry  green 0 

J'ai essayé code comme

cars= Car.objects.all().annotate(sales=0) 

mais nous avons eu des erreurs. Que puis-je faire?

Cheers, Dave

--Trindaz sur Fedang #django

Répondre

8

Vous pouvez utiliser la méthode extra(). Comme ceci:

Car.objects.all().extra(select = {'sales': 0}) 
+0

Merci pour la réponse rapide. Fonctionne très bien! – Trindaz

0
for car in Car.objects.all() 
    setattr(car, 'sales', 0) 

cela va ajouter à chaque élément dans votre queryset un champ nommé ventes avec la valeur 0. Ce champ ne peut être utilisé avec cette voiture exemple.

MISE À JOUR

+0

Merci pour la réponse rapide, mais cela n'a pas fonctionné pour moi. L'erreur: L'objet 'QuerySet' n'a pas d'attribut 'setattr' – Trindaz

+0

'Setattr' définit la valeur pour le _queryset_, pas pour la valeur _each dans le queryset_. http://docs.python.org/library/functions.html#setattr –

+0

Désolé pour mon erreur, la réponse est corrigée. – FallenAngel

2

Je me rends compte de la question initiale déclaré ne pas utiliser SQL « brut », mais de Django 1.8, l'utilisation de extra() est découragée. De l'docs:

Use this method as a last resort

This is an old API that we aim to deprecate at some point in the future.

Pour d'autres qui essaient de faire la même chose et sont prêts à utiliser un petit morceau de SQL brute, une alternative de travail, toujours en utilisant l'API de Django avec annotate() et RawSQL, est:

from django.db.models.expressions import RawSQL 
Car.objects.all().annotate(sales=RawSQL('SELECT 0',())) 
31

A partir de Django 1.8, annotate caractéristiques Value expression:

cars= Car.objects.all().annotate(sales=Value(0, IntegerField())) 

Au lieu de IntegerField vous pouvez utiliser toutes les classes de champs db disponibles.

Questions connexes