2016-12-14 152 views
2

我正在使用DRF創建具有多個附件的用戶。 創建用戶時,您必須上傳一個或多個文件。 當我更新一個加載新文件的用戶(沒有其他修改字段)時,迴應舊的實例。DRF上傳多個文件

我通過在返回實例之前強制序列化程序中的'_prefetched_objects_cache'屬性來解決這個問題。

setattr(instance, '_prefetched_objects_cache', True) 

它正確嗎? 你有其他解決方案嗎? 感謝

有我的代碼

在models.py

class User(models.Model): 
    #field of user model 

class Attachment(models.Model): 
    class Meta: 
     db_table = 'attachment' 

    path = models.FileField() 
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='attachments') 
    dt_created = models.DateTimeField(auto_now_add=True, verbose_name='Created') 

在serializer.py

class AttachmentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Attachment 
     fields = '__all__' 

class UserSerializer(serializers.ModelSerializer): 
    attachments = AttachmentSerializer(many=True, read_only=True) 


    def create(self, validated_data): 

     user = User.objects.create(**validated_data) 

     for file_item in self.initial_data.getlist('attachments'): 
     c = Attachment(path=file_item, user=user) 
     c.save() 
     return user 

    def update(self, instance, validated_data): 
     for item in validated_data: 
      if User._meta.get_field(item): 
       setattr(instance, item, validated_data[item]) 

     c = Attachment(path=self.context['request'].FILES['attachments'], user=instance) 
     c.save() 

     instance.save() 
     setattr(instance, '_prefetched_objects_cache', True) 
     return instance 

在test.py

io = StringIO.StringIO() 
io.write('foo') 
file = InMemoryUploadedFile(io, None, 'foo.txt', 'text', io.len, None) 
file.seek(0) 
self.user['attachments'] = [file, file] 
data = self.user 
response = self.client.post(url, data, format='multipart') 
file = InMemoryUploadedFile(io, None, 'foo2.txt', 'text', io.len, None) 
file.seek(0) 
#url = url of user detail for update 
local_user['attachments'].extend(response.data['attachments']) 
local_user['attachments'].append(file) 
data = local_user 
response = self.client.put(path=url, data=data, format='multipart') 

回答

0

我來到ACROS在某些時候,更多的問題不再是同樣的問題。和this answer解釋我如何解決它。