2017-08-26 115 views
0

說我有這些模型:模型相關的FileField Django的REST框架更新

class House(models.model): 
    address = models.CharField(max_length=100) 

class HouseImage(models.Model): 
    image = models.ImageField(...) 
    house = models.ForeignKey(House, related_name='images') 

而這個序列化:

class HouseImageSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = HouseImage 
     fields = ('image',) 

class HouseSerializer(serializers.ModelSerializer): 
    images = HouseImageSerializer(many=True, required=False) 
    class Meta: 
     model = House 
     fields = ('address', 'images',) 

這種觀點:

class HouseDetails(generics.RetrieveUpdateDestroyAPIView): 
    serializer_class = HouseSerializer 
    queryset = House.objects.all() 

我正在從我的前端撥打電話。一個創建房子(並且它工作),第二個應該發送圖像。因此,在第二個電話我想提出一個PATCH請求(與愛可信)和我request.data{'images': [InMemoryUploadedFile1, InMemoryUploadedFile2,...]}

問題:

  1. 上午我通過定義HouseSerializerimages領域做正確的這麼遠?如果這是正確的,我還應該做什麼?因爲我知道我需要以某種方式將我的request.data中的images列表中的每個圖像映射到HouseImage中的image字段。

  2. 有沒有更好的方法來實現呢?

回答

1

事實上你沒有patchHouse模型,嘗試創建新HouseImage,所以在我心目中最好的辦法是HouseImage模型新APIView。

在串行:

鑑於

class HouseImageDetails(generics.RetrieveUpdateDestroyAPIView): 
    serializer_class = HouseImageSerializer 
    queryset = HouseImage.objects.all() 
HouseSerializer

class HouseImageSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = HouseImage 
     fields = ('image', 'house') 
     #     ^^^^^^ 

你將不得不在images額外字段house什麼關係呢?

對於你的情況,你可以嘗試重寫update

class HouseSerializer(serializers.ModelSerializer): 
    images = HouseImageSerializer(many=True, required=False) 
    class Meta: 
     model = House 
     fields = ('address', 'images',) 

    def update(self, instance, validated_data): 
     request = self.context.get('request') 
     images = request.data.get('images', []) if request else [] 
     for img in images: 
      data = {'image': img, 'house': instance} 
      hiSerializer = HouseImageSerializer(data) 
      if hiSerializer.is_valid(): 
       hiSerializer.save() 
     return super(HouseSerializer, self).update(instance, validated_data) 
+0

但假如它不是一個補丁,是有沒有辦法來更新模型,並用單呼(單一視圖)的外鍵? –

+0

您可以嘗試覆蓋更新 –

相關問題