簡體   English   中英

更新 Django REST 框架中 ManyToMany 字段的數組

[英]Update array of ManyToMany field in Django REST framework

我有一個 Model 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 object 是同名的 model 的外鍵。 在我看來,我有這個partial_update function:

 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)

但是,當我想更新我的 plot 中的植物時,我可以 select 中的幾個,當我點擊添加時,它會更新,但它刪除了現有的舊植物,或者我希望在更新時這樣做,它保留數組中已經存在的植物,然后添加我們剛剛添加的植物。 我該怎么做才能得到這個結果?

這是我的序列化Plot model:

 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- 使用一些驗證器向序列化程序添加邏輯。 參考https://stackoverflow.com/a/66293267/9459826

更新:我刪除了#3,因為我忘記了 SerializerMethodField 是只讀的。 對不起。

文檔: https://www.django-rest-framework.org/api-guide/serializers/#validation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM