2017-08-21 4 views
0

持っている私がいる場合:djangoの配列に応じてクエリーセットフィルタ属性を使う方法は?

データは、参加者の配列です
data= request.data['participants'] 
Conversation.objects.filter(participants = data).values() 

、私はそれらの参加者を持って会話を取得したい

私は、外部キー(多くの1つ)に、配列を比較します。それらの参加者を含む会話を得る。

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

    } 

会話モデル:

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) 

会話シリアライザ:

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

    class Meta: 
     model = Conversation 
     fields = '__all__' 

私は参加者の配列に応じてフィルタリングする理由、私はの会話を作成すること参加者のセットは、それらの正確な参加者との会話があるかどうかを知る必要があります私はそれを作成しませんので、私はちょうどそれを返すでしょう、彼らは正確な参加者でない場合、私は新しい会話を作成します。

+0

「in」を確認https://docs.djangoproject.com/en/1.11/ref/models/querysets/#in – neverwalkaloner

+0

「in」は、これらの参加者のいずれかを含む会話を返します。私は会話をしたい'data = request.data ['participants']' – zezor93

+0

あなたの会話には多くの参加者または参加者が1人入っていますか?あなたはdata = request.data ['participants']に配列された参加者の集合しか持たない会話をしたいのですが、どういう意味ですか? – Ykh

答えて

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

私は、全く同じ参加者を持つ会話を得る必要があります。あなたの解決策は、 'id = 1'の'参加者 'を持つ会話を返すことを意味します。または 'id = 64' – zezor93

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

私はあなたがしようとしているかについて、正確にはわかりません。 Hope this helps you

+0

私は全く同じ参加者を持つ会話を得る必要があります。 あなたの解決策は、' id = 1'または 'id = 64'の'参加者 'を持つ会話を返すことを意味します。 – zezor93

+0

@ zezor93 I今度は 'user_name 'を使ってフィルタリングできるように答えを変更しました –

+0

はい、私はそれを見ることができます..しかし、これはどんな会話でも返されます。あるいは、どの会話にもtasus22があります。' zezor93'と ' tasus22 'のみお互いに。 – zezor93

関連する問題