2017-05-31 3 views
0

Un peu difficile à expliquer en quelques lignes, mais ce que j'essaie d'obtenir à partir du jeu de requête est de supprimer tous les noms dupliqués, mais aussi de renvoyer un champ booléen. Je pense que ce sera plus facile de montrer des exemples.comment puis-je distinguer un queryset mais aussi sélectionner ce qui est nécessaire dans un champ différent? django

Model.order_by('-selected', 'name').distinct('selected', 'name') 

cela me donnerait queryset et ce qui est à l'intérieur serait quelque chose comme pour ma sortie ..

[ 
    { 
    "selected": true, 
    "id": 163, 
    "name": "11111111" 
    }, 
    { 
    "selected": true, 
    "id": 178, 
    "name": "22222222222" 
    }, 
    { 
    "selected": false, 
    "id": 152, 
    "name": "152-JE" 
    }, 
    { 
    "selected": false, 
    "id": 163, 
    "name": "11111111" 
    }, 
    { 
    "selected": false, 
    "id": 178, 
    "name": "22222222222" 
    }, 
    { 
    "selected": false, 
    "id": 213, 
    "name": "mingzi" 
    } 
] 

Ce que je veux pour ma sortie est de distinct tous les noms dupliqués et montrer selected: True (si S'il n'y a pas de Vrai, montre celui qui est avec False mais maintenant il montrerait les deux .J'ai voulu faire distinct('name'), je ne dois pas utiliser order_by mais je pensais qu'en le faisant, il ferait celui avec True haut et puis distinct ceux en bas. Je ne peux pas seulement faire order_by('select') puis distinct('name') puisque ce qui est dans order_by doit être distinct.

Quelqu'un peut-il me donner un coup de main? Merci d'avance

Répondre

0

La description est un peu déroutant mais essayez ce qui suit (Django < 1,10).

d'abord obtenir tous les modèles qui ont choisi vrai:

true_models = Model.objects.filter(selected=True).distinct('name').values_list('name', flat=True) 

obtenez alors tous les modèles qui sont vraies ou fausses. Mais s'il y a un nom qui est sélectionné vrai et faux, gardez seulement celui qui est vrai.

Model.objects.exclude(selected=False, id__name=true_models).order_by('name').distinct('name') 

Vous voudrez peut-être ajouter un filtre supplémentaire par une autre condition. Si c'est le cas, ajoutez le filtre dans les deux requêtes.

+0

je recevrais une telle erreur si 'recherche Unsupported « name » pour AutoField ou rejoindre sur le terrain ne nom comme licite est en fait un champ' ForeignKey'. dans le modèle si – Tsuna

+0

Ok, mettez à jour votre message avec le champ qui doit être unique à partir du modèle foreignKey. Ensuite, je peux mettre à jour le mien avec les corrections. Mais la logique serait la même que vous avez juste besoin de changer le nom du champ réel avec: "name__FIELD". –

+0

le modèle 'name' a id comme champ unique – Tsuna