我想通过传递或不 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-engine
,google-cloud-datastore
和django-dbindexer
。
答案 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.create
为here,ViewSet.update
为here。
请注意,您可能最终会为/tag/
和/tag/:id
提供两个不同的序列化程序,因为后者不应允许id
字段在前者应该可写时。
答案 2 :(得分:0)
我写a drf views mixin用于通过id更新对象,如果没有相应的对象,只需创建它然后更新。