0

私はDjango 1.10.5djangorestframework 3.5.3を使用しています。Django rest - ネストされたオブジェクトをシリアライズ

私は、多くの関係に1と関連している2つの機種があります。各モデル

class Minisymposium(models.Model): 
    STATUS_CHOICES = (
     ('pending', 'Pending'), 
     ('approved', 'Approved'), 
     ('denied', 'Denied')) 

    id = models.AutoField(primary_key=True) 
    number = models.IntegerField(default=0, null=False) 
    title = models.CharField(max_length=100, null=False) 
    description = models.TextField(max_length=9000, null=False) 
    status = models.CharField(max_length=100, choices=STATUS_CHOICES, null=False, default='pending') 
    user = models.ForeignKey(User, null=False, related_name='user') 
    corresponding_organizer = models.ForeignKey(User, null=False, related_name='corresponding_organizer') 
    anticipated_abstracts = models.IntegerField(null=False) 
    anticipated_attendees = models.IntegerField(null=False) 
    date = models.DateTimeField(auto_now_add=True) 

def __str__(self): 
    return '{0}-{1}'.format(self.number, self.title) 

class UnregisteredOrganizer(models.Model): 
    id = models.AutoField(primary_key=True) 
    first_name = models.CharField(max_length=1000, blank=False) 
    last_name = models.CharField(max_length=1000, blank=False) 
    email = models.EmailField(max_length=254, blank=True) 
    affiliation = models.CharField(max_length=254, help_text='(institution only)', blank=True) 
    phone_number = PhoneNumberField(blank=True) 
    minisymposium = models.ForeignKey(Minisymposium, related_name='other_organizers') 

は、シリアライザを持っています。しかし、問題はMinisymposiumのシリアライザです。私はUnregisteredOrganizerのIDを作成する際にIDを送信し、Minisymposiumを取得するとシリアル化されたオブジェクト全体を取得したいからです。 そして、私はModelSerializerに見るように、それは不可能です。

class MinisymposiumSerializer(serializers.ModelSerializer): 
    other_organizers = UnregisteredOrganizerSerializer(many=True) 

    class Meta: 
     model = Minisymposium 
     fields = ('url', 'id', 'number', 'title', 'description', 'status', 'user', 'corresponding_organizer', 
        'anticipated_abstracts', 'anticipated_attendees', 'other_organizers', 'date') 

    def create(self, validated_data): 
     other_organizers = [] 

     if 'other_organizers' in validated_data: 
      other_organizers = validated_data.pop('other_organizers') 

     minisymposium = Minisymposium.objects.create(**validated_data) 
     minisymposium.save() 

     for organizer in other_organizers: 
      UnregisteredOrganizer.objects.create(minisymposium=minisymposium, **organizer).save() 

     return minisymposium 

はどのように私はそれを行うことができますか? ありがとうございました!

+0

あなたが送信したいJSONを投稿することができますか? – ilse2005

答えて

2

私はUnregisteredOrganizerのIDを作成して送信したいので、Minisymposiumを取得する際にシリアル化されたオブジェクト全体を取得したいからです。

なぜこのような矛盾したAPIがありますか?

ここで推奨されるオプションは、がread_only=Falseであることを除いて、Minisymposiumのフィールドをread_onlyに設定することです。

したがって、データを取得するときに完全なオブジェクトを取得し、データのポスト/プット/パッチ適用時にIDを期待するだけです。投稿JSONは次のようになります。

{ 
    ... 
    "url": "whatever", 
    "title": "Some nice title", 
    "other_organizers": [{"id": 5}, {"id": 5123}] 
} 

作成コードは次のようになります:

def create(self, validated_data): 
    other_organizers = validated_data.pop('other_organizers', []) 

    minisymposium = Minisymposium.objects.create(**validated_data) 
    minisymposium.save() 

    organizers = [] 
    for organizer_id in other_organizers: 
     organizers .append(UnregisteredOrganizer.objects.get(id=organizer_id) 
    minisymposium. other_organizers = organizers 

    return minisymposium 
関連する問題