2013-12-10 11 views
5

djangoのドキュメントで、through引数を使用して仲介者として動作するモデルを指すM2M関係について説明します。django-restでのM2M関係の操作方法

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, 
            through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 

    class Meta: 
     ordering = ['date_joined'] 

、私は各グループ内でも、すべての人が含まれているグループモデルの読み書きビュー休息を持つようにしたい今想定date_joinedフィールド。私が取得したいJSONシリアライズは、(メンバーだけ自分のIDと説明されている)以下の通りです:読み取り操作のために、それがうまく動作しますが、それを

class GroupSerializer(serializers.ModelSerializer): 
    members = serializers.SlugRelatedField(source='membership_set', 
              many=True, 
              read_only=False, 
              slug_field='person_id', 
              required=True) 

    class Meta: 
     model = Group 
     fields = ('id', 'name', 'members') 

{ 
    "id": 1, 
    "name": "U2", 
    "members": [ 
     20, 
     269, 
     134, 
     12, 
    ] 
} 

私は、シリアライザを書きました書いてはいけません。上記で定義された直列化与えられ、それがで進める、となるよう、私はシリアライザを定義する必要があります方法:

  1. グループオブジェクト
  2. (メンバーオブジェクトを作成することによって)グループに各メンバーを追加します
を作成します。

答えて

2

hereから、実行しようとしている操作が読み取り操作でのみ機能することがわかります。これは、作成者のTom Christieがthisコメントで述べたように、DRFの一般的な問題です。

また、希望するJSONシリアライズの場合は、hereのようにPK関連フィールドを使用することをお勧めしますが、Groupオブジェクトの作成やメンバーの追加には役立ちません。そのコードを自分で書く必要があります。

これが役に立ちます。メンバーシップを作成することで、グループに一人一人を追加するための

編集

コードスニペット:

def post_save(self, obj, created=False): 
    # obj represents the Group object 
    if created: 
     # Test to see if the Group was successfully created 
     members = self.request.DATA.get('members', None) 
     if members not None: 
      for id in members: 
       person = Person.objects.get(id=id) 
       membership, m_created = Membership.objects.get_or_create(person=person, group=obj) 
       # Here you can use m_created to see if the membership already existed and to do whatever else you need. 

この実装では、auto_nowでdate_joinedあなたを宣言していることを前提としています。そうでない場合は、パラメータとして渡す必要があります。

+0

あなたが私に与えた明確な答えを、ありがとう、ドキュメントの関連部分へのリンクまたはその点に関する著者の答えに感謝します。私がしようとしていることは、フレームワークによってあまりサポートされていません。あなた自身でコードを書いてこの作業を達成する方法を提案してください。正しい方法は何ですか?ありがとうございました! – Dragster

+0

私は助けることができてうれしい:)作成部分については、** post/create **メソッドまたは** post_save **メソッドの2つの場所で行うことができます。 ** post_save **で行うことをお勧めします。これは、フレームワークにGroupオブジェクトの作成を許可していることを意味し、メンバーの追加だけです。このメソッドの使い方については、小さなコードスニペットで回答を編集します。 – AdelaN

+0

ありがとう、あなたのサポートは非​​常に高く評価されています! – Dragster

関連する問題