Google App Engine - Django Rest Framework Update 或 Create (如



我想通过传递或不传递id字段来使用django-rest-framework执行更新或创建。我有这个模型

class Etiqueta(models.Model):
    name_tag = models.CharField(max_length=200, blank=False, null=False)
    description_tag = models.TextField(max_length=500, blank=False, null=False)
    def __unicode__(self):
        return self.name_tag

django-rest-framework我有这个序列化程序

from myapp.modulos.estado_1.models import Etiqueta
from rest_framework import serializers, viewsets
# Serializers define the API representation.
class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Etiqueta
        fields = (
            'id',
            'name_tag',
            'description_tag'
        )
# ViewSets define the view behavior.
class TagViewSet(viewsets.ModelViewSet):
    queryset = Etiqueta.objects.all()
    serializer_class = TagSerializer

通常,当我创建一个对象时,我会在没有/:id的情况下对 URL 执行POST,但是如果我有一个具有本地 id 的对象,我希望在REST中使用相同的 id(远程 id)创建他,django覆盖我的本地 id 并创建一个新 id有谁知道如何实现这一目标?另外值得一提的是,我正在与google-app-enginegoogle-cloud-datastoredjango-dbindexer合作。

这段代码应该适用于你的情况 -

class TagViewSet(viewsets.ModelViewSet):
      queryset = Etiqueta.objects.all()
      serializer_class = TagSerializer
      def get_object(self):
          if self.request.method == 'PUT':
              obj, created = Etiquetta.objects.get_or_create(pk=self.kwargs.get('pk'))
              return obj
          else:
              return super(TagViewSet, self).get_object()

你应该看看 Django REST 框架目前是如何做的,并调整你的创建方法,以便在你有 id 字段时进行更新。

原来的ViewSet.create在这里,ViewSet.update在这里。

请注意,您最终可能会得到两个不同的序列化程序,用于/tag//tag/:id,因为后者不应允许id字段可写,而前者应该。

我已经编写了一个 drf views mixin 用于按 id 更新对象,如果没有相应的对象,只需创建它然后更新。

相关内容

  • 没有找到相关文章

最新更新