2010-03-30 13 views
1

J'essaie d'obtenir une liste distincte dans le forms.py comme ceci:Django Distinct sur queryset dans forms.py

forms.ModelMultipleChoiceField (queryset = Events.objects.values ​​('nom d'hôte'), nécessaire = False) .distinct()

Dans le shell python, cette commande fonctionne parfaitement, mais lorsque vous l'essayez dans forms.py, cela me laisse un formulaire vide, donc rien n'apparaît. Quand je fais juste Events.objects.all() le formulaire apparaît, mais distinct ne fonctionne pas avec Events.objects.all() ... j'ai également essayé values_list etc, mais ne semble pas entrer dans les formes ni .. Quelqu'un a-t-il une idée de comment obtenir un SELECT DISTINCT dans un ModelMultipleChoiceField?

J'ai lu quelques autres questions à ce sujet à stackoverflow mais rien ne semble fonctionner avec moi, donc j'espère que quelqu'un sait comment faire cela dans forms.py.

Thxs à l'avance

Répondre

0

Pour une ModelMultipleChoiceField, Django attend un objet modèle - car il stocke la valeur de clé primaire de l'élément sélectionné. En d'autres termes, il est destiné à être utilisé pour gérer les champs ManyToMany.

Il semble que vous vouliez stocker la valeur de chaîne réelle, donc ce n'est peut-être pas le bon choix pour vous. Vous souhaitez probablement utiliser un MultipleChoiceField standard et remplacer la méthode __init__ du formulaire pour définir l'attribut choices du champ. Rappelez-vous cependant que chaque champ de choix est un ensemble de 2-tuples, contenant chacun la valeur db et la valeur d'affichage - même si vous voulez qu'ils soient identiques, vous devrez inclure la valeur deux fois:

def __init__(self, *args, **kwargs): 
    super(MyFormClass, self).__init__(*args, **kwargs) 
    self.fields['mychoicefield'].choices = [(x[0], x[0]) for x in 
           Event.objects.values_list('hostname').distinct()])