2017-08-21 2 views
0

si j'ai.comment utiliser l'attribut de filtre queryset en fonction de tableau dans django?

data= request.data['participants'] 
Conversation.objects.filter(participants = data).values() 

où les données sont un ensemble de participants, je veux obtenir des conversations qui ont les participants à

je veux comparer un tableau à une clé étrangère (un à plusieurs) pour obtenir une conversation qui contient ces participants.

 { 
     "conversation_id": 38, 
     "created_at": "2017-08-14T09:15:19.776000Z", 
     "name": "first conversation", 
     "participants": [ 
      { 
       "id": 1, 
       "username": "zezor93", 
      }, 
      { 
       "id": 64, 
       "username": "tasus22", 
      } 
     ] 

    } 

modèle Conversation:

class Conversation(models.Model): 
    user = models.ForeignKey(User, null=False) 
    participants = models.ManyToManyField(User, related_name='participants') 
    created_at = models.DateTimeField(_('created at'), auto_now_add=True) 
    name = models.CharField(_("file title"), max_length=50, null=True, blank=True) 

Conversation sérialiseur:

class ConversationSerializer(ModelSerializer): 
    user = UserSerializer(many=False, read_only=True) 
    participants = UserSerializer(many=True, read_only=True) 

    class Meta: 
     model = Conversation 
     fields = '__all__' 

la raison pour laquelle je veux filtrer selon le tableau de participants, que lorsque je crée une conversation un ensemble de participants, je dois savoir s'il y a une conversation avec ces partic exact ipant donc je ne vais pas le créer je vais juste le retourner, si elles ne sont pas les participants exacts je vais créer une nouvelle conversation.

+0

Vérifiez 'in' https://docs.djangoproject.com/fr/1.11/ref/models/querysets/#in – neverwalkaloner

+0

' in' renverra toute conversation contenir un de ces participants .. je veux avoir une conversation qui n'ont que cet ensemble de participants dans 'data = request.data ['participants']' – zezor93

+0

votre conversation contient de nombreux participants ou un participant? poster votre modèle peut aider. vous voulez avoir une conversation qui n'a que cet ensemble de participants dans data = request.data ['participants'], que voulez-vous dire par seulement? – Ykh

Répondre

0
Conversation.objects.filter(participants__id__in = [x['id'] for x in data]).values() 
+0

je dois obtenir la conversation qui a exactement les mêmes participants .. je veux dire que votre solution renverra des conversations qui a 'participants 'de' id = 1' ou 'id = 64' – zezor93

0
Conversation.objects.filter(participants__username__in = [participant['username'] for participant in data]).values() 

Je ne suis pas sûr de ce que vous avez l'intention de le faire. Hope this helps you

+0

je dois obtenir la conversation qui a exactement les mêmes participants .. je veux dire que votre solution va retourner les conversations qui a' participants 'de 'id = 1' ou' id = 64' – zezor93

+0

@ zezor93 I a changé la réponse pour que maintenant il peut être filtré en utilisant 'user_name ' –

+0

oui je peux voir que .. cependant cela retournera toute conversation a zezor93 ou toute conversation a tasus22 .. je veux retourner la conversation qui a' zezor93' et ' tasus22 seulement les uns avec les autres. – zezor93