Benim serileştirici iki iç içe serilaştırıcı içerir, bu nedenle bu seri hale getirici güncelleme yöntemini geçersiz kılar. Ancak, bu güncelleştirme yöntemine gönderilen validated_data alanı "temizlenir" ve birçok alanın çoğu yok.django dinlenme çerçevesi partial_update yaparken birçok alanda birçok alanı silme
serializer.initial_data
QueryDict şudur: Bu ModelSerializer arasında
güncelleme (iç validated_data)
şöyledir: {[, u'9' u'exchange u'1]}{ 'ADGROUP_NAME': u'adgroup_name', u'creative ': [], güncelleme içine validated_data() 'CAMPAIGN_ID':, u'exchange': []}
alanı "excha nge "temelde kaldırıldı veya temizlendi! Bundan nasıl kurtulurum? Model: görünümünde
class AdGroup(models.Model):
adgroup_name = models.CharField(max_length=200, verbose_name="Name")
exchange = models.ManyToManyField(Exchange, verbose_name="Exchange")
creative = models.ManyToManyField(Creative, verbose_name="Creative")
Güncelleme kodu:
class AdGroupViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = AdGroup.objects.all().order_by('-id')
serializer_class = AdGroupSerializer
filter_fields = ('campaign_id',)
def update(self,
request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
print 'view serializer data is'
print serializer.initial_data
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
except Exception as e:
print "update in viewset error "+str(e)
traceback.print_exc()
def perform_update(self, serializer):
serializer.save()
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
print 'partial update called with'
print request.data
return self.update(request, *args, **kwargs)
serileştirici kodudur:
class AdGroupSerializer(serializers.ModelSerializer):
exchange = ExchangeSerializer(many=True)
creative = CreativeSerializer_reduced(many=True)
class Meta:
model = AdGroup
fields = ('id','name','exchange','creative')
def update(self, instance, validated_data):
try:
print 'serialzier update called and the validated_data is'
print validated_data
if validated_data['state']:
print 'state is sent'
instance.state = validated_data['state']
if validated_data['exchange']:
print 'exchange is sent'
print validated_data['exchange']
instance.exchange = validated_data['exchange']
if validated_data['creative']:
print 'creaitve is sent'
print validated_data['creative']
instance.creative = validated_data['creative']
instance.save()
return instance
except Exception as e:
logger.info("Update Serializer error is "+str(e))
Değişim serileştirici geçerli:
class ExchangeSerializer(serializers.ModelSerializer):
class Meta:
model = Exchange
fields = ('id','name',)
Creaitve serileştirici geçerli:
Evet. Sorun buydu. Ön uç gönderme listesi ID'leri vardı, çünkü bu M2M ilişkileri olan nesneyi oluştururken DB'ye kaydetmek daha kolaydı. Şu anda iki serileştirici kullanıyorum - biri (bu iç içe geçme yolu dahil) ve diğeri oluşturmak için (kimliklerin listesi olan). – ram