我想通过传递或不传递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-engine
,google-cloud-datastore
和django-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 更新对象,如果没有相应的对象,只需创建它然后更新。