Django Rest Framework更新或创建(如果不存在)

mar*_*ise 4 django google-app-engine django-rest-framework google-cloud-datastore

我想使用执行更新或创建django-rest-framework,通过传递与否id领域.我有这个型号

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

通常当我创建一个对象时,我执行一个POST没有的URL /:id,但如果我有一个具有本地ID的对象,我希望他在REST具有相同id(远程id)的情况下创建,django覆盖我的本地id并创建一个新的.有谁知道如何实现这一目标?还需要提及的是我的工作是非常重要的google-app-engine,google-cloud-datastoredjango-dbindexer.

hsp*_*her 5

此代码适用于您的情况 -

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()
Run Code Online (Sandbox Code Playgroud)