2017-08-26 4 views
0

Sagen, ich habe diese Modelle:Django Rest Rahmen Update Filefield eines Modells

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

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

Und dieses Serializer:

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

Und diese Ansicht:

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

ich, damit ich bin Anrufe von meinem Frontend. Einer erstellt das Haus (und es funktioniert) und der zweite soll die Bilder senden. Deshalb habe ich in der zweiten Anruf mache eine PATCH Anfrage (mit axios) und mein request.data ist {'images': [InMemoryUploadedFile1, InMemoryUploadedFile2,...]}

Fragen:

  1. Bin ich durch die Definition der images Feld auf HouseSerializer richtig so weit zu tun? Wenn es richtig ist, was soll ich sonst tun? Weil ich weiß, muss ich irgendwie jedes Bild in images Liste in meinem request.data auf dem image Feld in HouseImage zuordnen.

  2. Gibt es einen besseren Ansatz bei der Umsetzung?

Antwort

1

de facto haben Sie nicht patch Sie House Modell, versuchen Sie neue HouseImage zu schaffen, so in meinem Kopf beste Weg, um neue APIView für HouseImage Modell.

in Serializer:

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

im Blick

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

in HouseSerializer werden Sie zusätzliches Feld haben house im images ist es wichtig?

für Ihren Fall können Sie versuchen, die 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

außer Kraft zu setzen Aber es ist nicht ein Patch Gesetzt, gibt es keine Möglichkeit, Modelle und ihre Fremdschlüssel mit einem einzigen Anruf (Einzelansicht) zu aktualisieren? –

+0

können Sie versuchen, das Update zu überschreiben –

Verwandte Themen