2

J'utilise DRF pour créer un utilisateur avec plusieurs pièces jointes. Lorsque vous créez un utilisateur, vous devez télécharger un ou plusieurs fichiers. Lorsque je fais une mise à jour d'un utilisateur pour lequel vous chargez un nouveau fichier (aucun autre champ modifié), la réponse renvoie l'ancienne instance. J'ai résolu en forçant l'attribut '_prefetched_objects_cache' dans le sérialiseur avant de renvoyer l'instance.DRF Téléverser plusieurs fichiers

setattr(instance, '_prefetched_objects_cache', True) 

Est-ce correct? Vous avez d'autres solutions à ce sujet? grâce

Il est mon code

dans 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') 

dans 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 

dans 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') 

Répondre

0

Je suis Acros s plus de moins le même problème il y a quelque temps. Et this answer explique comment je le résoudre.