2016-10-26 12 views
0

多対多の関係でリンクされた2つのモデルのデータを作成するAPIエンドポイントを作成します。これらのモデルがUserGroupであるとします。M2MでデータをPOSTする方法は?

要件:

  • どちらの関与のモデルがまだ存在していないので、私はそれらを記述するためにpkを使用することはできません。
  • エンドポイントは、必要な数のユーザー/グループを作成できます。

それらのモデルの間の関係は、(ユーザがN個のグループにすることができ、すなわち、そのグループが1人のユーザに関連することができる。)、1-> Nであったであろう、溶液は自明であったであろう場合:

'user1': {'name': "robert", 
     'groups': [{'name': 'group1'}, {'name': 'group2'}] 
     } 
'user2': {'name': "jean", 
     'groups': [{'name': 'group3'}, {'name': 'group4'}] 
     } 

しかし、M2Mのように、どうすればいいのですか?ネストは動作しません。この場合

'user1': {'name': "robert", 
     'groups': [{'name': 'group1'}, {'name': 'group2'}] 
     } 
'user2': {'name': "jean", 
     'groups': [{'name': 'group2'}, {'name': 'group3'}] 
     } 

は、サーバはおそらく、私は自分自身が二度1つのオブジェクトを指定しようとしてrepetingてる代わりに3プラスの4グループを作成しようとします。

ここで、グループオブジェクトは単純なモデルですが、私の実際のケースでは、オブジェクトは複数レベルの入れ子を持つ複雑なオブジェクトなので、繰り返しはできません。

これをどのように解決しますか? 私が覚えている唯一の解決策は、1つではなく2つのHTTP呼び出しを行うことです。

注:私はDjangoとDjango Rest Frameworkを使用しています。

答えて

0

ユーザーモデルにgroups = ManyToManyField(Group)があると仮定すると、次のように動作します。

ユーザシリアライザでフィールドgroups = GroupSerializer()を定義します(GroupSerializerModelSerializerとして実装する必要があります)。あなたのシリアライザのcreate方法で

、あなたはこのようなものがあります:

def create(self, validated_data): 
    // Groups list has existing groups and new ones as well 
    groups = validated_data.pop('groups') 

    // Get existing groups by name 
    existing_groups = Group.objects.filter(name__in=[g.name for g in groups]) 
    existing_group_names = [g.name for g in existing_groups] 

    // Create new groups 
    groups_to_create = [] 
    for g in groups: 
     if g.name not in existing_group_names: 
      groups_to_create.append(g) 
    Group.objects.bulk_create(groups_to_create) 

    // Now that we have all groups, create the user and add the groups to his groups list, updating the M2M relationship 
    user = User.objects.create_user(**validated_data) 
    user.groups.add(existing_groups + groups_to_create) 
+0

おかげで、しかし決して、グループ名は一意である必要があります。私はこの例を選びましたが、それは簡単に思えましたが、私の場合は名前でオブジェクトを識別できません.PKSが必要です。 –

関連する問題