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

时间:2015-06-18 19:45:15

标签: 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

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

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

您应该了解当前Django REST框架的工作方式,并在您拥有id字段时调整create方法以进行更新。

原始ViewSet.createhereViewSet.updatehere

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

答案 2 :(得分:0)

我写a drf views mixin用于通过id更新对象,如果没有相应的对象,只需创建它然后更新。