0

我正在使用Django 1.10.5djangorestframework 3.5.3Django rest - 序列化嵌套對象

我有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的串行器上。因爲我想在創建一個ID時發送一個UnregisteredOrganizer的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?

這裏推薦的選項是將Minisymposium上的字段設置爲read_only,id應該是read_only=False

因此,您可以在獲取數據時獲取完整對象,並在發佈/放置/修補數據時僅預期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 
相關問題