Я пытаюсь добавить ответ с полным телом модели автомобиля, но хочу настроить только 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)