Как обновить существующее поле "многие ко многим" в Django REST?
У меня есть такая модель графика:
class Plot(models.Model):
garden = models.ForeignKey('perma_gardens.Garden', on_delete=models.CASCADE)
plant = models.ManyToManyField('perma_plants.Plant', related_name='%(class)s_plant', blank=True)
def __str__(self):
return self.name
Содержит поле для растений в формате "многие ко многим".
В моей базе данных уже есть несколько созданных растений. И я хотел бы иметь возможность обновлять модель участка, добавляя в него растения по ID, я реализовал функцию partial_update
в файле views.py
, но когда я обновляю участок, добавляя в него растение на основе его ID, он сообщает мне, что: "Объект растения с этим пользовательским полем id уже существует"
Вот мой serializers.py
файл :
class GardenSerializer(serializers.ModelSerializer):
class Meta:
model = Garden
fields = ('id', 'name',)
class PlantSerializer(serializers.ModelSerializer):
class Meta:
model = Plant
fields = ('custom_id', 'name', "category", 'image', 'facility_rate', 'sunshine_index', 'irrigation_index')
class WritePlotSerializer(WritableNestedModelSerializer, serializers.ModelSerializer):
plant = PlantSerializer(many=True)
class Meta:
model = Plot
fields = '__all__'
Вот мой views.py
файл :
class PlotViewSet(viewsets.ModelViewSet):
queryset = Plot.objects.all()
def create(self, request, *args, **kwargs):
serializer = WritePlotSerializer(data=request.data, many=isinstance(request.data, list))
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def partial_update(self, request, *args, **kwargs):
instance = self.queryset.get(pk=kwargs.get('pk'))
serializer = WritePlotSerializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
def delete(self, request, pk):
snippet = self.get_object(pk)
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
def get_serializer_class(self):
if self.action in ("list", "retrieve"):
return ReadPlotSerializer
return WritePlotSerializer