更新 Django REST 框架中 ManyToMany 字段的数组
Update array of ManyToMany field in Django REST framework
我有一个模型 Plot
,它看起来像这样:
from django.db import models
class Plot(models.Model):
class SUNSHINE(models.TextChoices):
NONE = None
FULL_SUN = 'Plein soleil',
SHADOW = "Dans l'ombre",
SUNNY = 'Ensoleillée',
MODERATE = 'Modérée'
name = models.CharField(max_length=50)
garden = models.ForeignKey('perma_gardens.Garden', on_delete=models.CASCADE)
width = models.CharField(max_length=50, blank=True, null=True)
height = models.CharField(max_length=50, blank=True, null=True)
exposition = models.CharField(max_length=50, choices=SUNSHINE.choices, default=SUNSHINE.NONE, blank=True,
null=True)
qr_code = models.CharField(max_length=50, blank=True, null=True)
plant = models.ManyToManyField('perma_plants.Plant', related_name='%(class)s_plant', blank=True)
def __str__(self):
return self.name
带有一个 plant
对象,它是同名模型的外键。
在我看来,我有这个 partial_update
函数:
class PlotViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = Plot.objects.all()
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)
但是,当我在我面前想要更新我的地块中的植物时,我可以 select 几个,当我点击添加时它会更新,但它删除了现有的旧植物或者我希望当我更新时,它保留数组中已经存在的植物,然后添加我们刚刚添加的植物。我怎样才能得到这个结果?
这是我的 Plot
模型的序列化程序:
from rest_framework import serializers
from .models import Plot
from apps.perma_plants.models import Plant
from apps.perma_gardens.models import Garden
from apps.perma_plant_categories.models import PlantCategory
class GardenSerializer(serializers.ModelSerializer):
class Meta:
model = Garden
fields = ('id', 'name',)
class PlantSerializer(serializers.ModelSerializer):
class Meta:
model = Plant
fields = ('id', 'name', "category", 'image', 'facility_rate', 'sunshine_index', 'irrigation_index')
class ReadPlotSerializer(serializers.ModelSerializer):
garden = GardenSerializer(required=True)
plant = PlantSerializer(many=True)
id = serializers.IntegerField(read_only=True)
class Meta:
model = Plot
fields = '__all__'
read_only_fields = [fields]
class WritePlotSerializer(serializers.ModelSerializer):
class Meta:
model = Plot
fields = '__all__'
感谢您的反馈!
有几种方法可以解决这个问题:
1- 在请求中发送整个数组
2- 使用一些验证器向序列化程序添加逻辑。参考
更新:我删除了#3,因为我忘记了 SerializerMethodField 是 read-only。对不起。
文档:https://www.django-rest-framework.org/api-guide/serializers/#validation
我有一个模型 Plot
,它看起来像这样:
from django.db import models
class Plot(models.Model):
class SUNSHINE(models.TextChoices):
NONE = None
FULL_SUN = 'Plein soleil',
SHADOW = "Dans l'ombre",
SUNNY = 'Ensoleillée',
MODERATE = 'Modérée'
name = models.CharField(max_length=50)
garden = models.ForeignKey('perma_gardens.Garden', on_delete=models.CASCADE)
width = models.CharField(max_length=50, blank=True, null=True)
height = models.CharField(max_length=50, blank=True, null=True)
exposition = models.CharField(max_length=50, choices=SUNSHINE.choices, default=SUNSHINE.NONE, blank=True,
null=True)
qr_code = models.CharField(max_length=50, blank=True, null=True)
plant = models.ManyToManyField('perma_plants.Plant', related_name='%(class)s_plant', blank=True)
def __str__(self):
return self.name
带有一个 plant
对象,它是同名模型的外键。
在我看来,我有这个 partial_update
函数:
class PlotViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = Plot.objects.all()
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)
但是,当我在我面前想要更新我的地块中的植物时,我可以 select 几个,当我点击添加时它会更新,但它删除了现有的旧植物或者我希望当我更新时,它保留数组中已经存在的植物,然后添加我们刚刚添加的植物。我怎样才能得到这个结果?
这是我的 Plot
模型的序列化程序:
from rest_framework import serializers
from .models import Plot
from apps.perma_plants.models import Plant
from apps.perma_gardens.models import Garden
from apps.perma_plant_categories.models import PlantCategory
class GardenSerializer(serializers.ModelSerializer):
class Meta:
model = Garden
fields = ('id', 'name',)
class PlantSerializer(serializers.ModelSerializer):
class Meta:
model = Plant
fields = ('id', 'name', "category", 'image', 'facility_rate', 'sunshine_index', 'irrigation_index')
class ReadPlotSerializer(serializers.ModelSerializer):
garden = GardenSerializer(required=True)
plant = PlantSerializer(many=True)
id = serializers.IntegerField(read_only=True)
class Meta:
model = Plot
fields = '__all__'
read_only_fields = [fields]
class WritePlotSerializer(serializers.ModelSerializer):
class Meta:
model = Plot
fields = '__all__'
感谢您的反馈!
有几种方法可以解决这个问题:
1- 在请求中发送整个数组
2- 使用一些验证器向序列化程序添加逻辑。参考
更新:我删除了#3,因为我忘记了 SerializerMethodField 是 read-only。对不起。
文档:https://www.django-rest-framework.org/api-guide/serializers/#validation