Я пытаюсь добавить ответ с полным телом модели автомобиля, но хочу настроить только 1 поле в том же представлении, которое является car.collection

enter code here

В основном я хочу добавить 2 функции ... добавить в коллекцию, удалить из коллекции, при этом имея полное тело объекта автомобиля в ответе, но корректируя только поле отношения коллекции

serializers

class CarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Car
        fields = ['id', 'model', 'maker', 'release_year', 'vin', 'owner', 'collection']
        
        
        def update(self, instance, validated_data):
            instance.collection = validated_data.get('collection', instance.collection)
            return instance
        

class CarCollectionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Car
        fields = ['id', 'collection']

class CollectionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Collection
        fields = ['id', 'name', 'created_at']

models


class Collection(models.Model):
    name = models.CharField(max_length=30)
    created_at = models.DateTimeField(auto_now_add=True)
    

    def __str__(self):
        return f"{self.name}"

    
class Car(models.Model):
    model = models.CharField(max_length=40)
    maker = models.CharField(max_length=60)
    release_year = models.IntegerField()
    vin = models.CharField(max_length=100)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, default=None)
    collection = models.ManyToManyField(Collection)
    
    
    def __str__(self):
        return f"{self.model}"

views


class CarViewSet(viewsets.ModelViewSet):
    """
    A simple ViewSet for listing or retrieving cars.
    """
    queryset = Car.objects.all()
    serializer_class = CarSerializer
    permission_classes = [IsAuthenticated, IsCarOwner]
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class =  CarFilter
    filter_fields = ('maker', 'release_year', 'vin')
    ordering_fields = 'release_year'
    
    @action(detail=True, methods=['GET', 'Put'])
    def update_car_collection(self, request, pk=None, format=None):
        car = Car.objects.get(pk=pk)
        collection = Collection.objects.get(pk=pk)
        serializer = CarCollectionSerializer(car, request.data)
        if serializer.is_valid():
            serializer.save()
            car.collection = serializer.data.get(collection, car.collection)
        return Response(serializer.data)
Вернуться на верх