2017-08-26 87 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

您可以尝试覆盖更新 –