django - instalar - pip3 install rest_framework
Actualización del marco Django Rest o Crear si no existe (3)
Debería echar un vistazo a cómo funciona Django REST framework actualmente y adapta su método de creación para actualizar cada vez que tenga un campo de id.
El ViewSet.create
original está aquí y ViewSet.update
está aquí .
Tenga en cuenta que probablemente terminará con dos serializadores diferentes para /tag/
y /tag/:id
ya que el último no debería permitir que el campo de id
sea editable mientras que el anterior debería.
Quiero usar la realización de una actualización o crear en django-rest-framework
, pasando o no el campo id
. Tengo este modelo
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
Y en django-rest-framework
tengo este serializador
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
Normalmente, cuando creo un objeto, realizo una POST
a la URL sin /:id
, pero si tengo un objeto con una identificación local , quiero que se cree en REST
con la misma identificación (ID remota) , django
sobrescribe mi identificación local y crea una nueva. ¿Alguien sabe cómo lograr esto? También es importante mencionar que estoy trabajando con google-app-engine
, google-cloud-datastore
y django-dbindexer
.
Este código debería funcionar para su caso:
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()
He escrito un drf views mixin para actualizar un objeto por id, si no hay un objeto correspondiente, simplemente créelo y luego actualícelo.