with rest_framework pip3 instalar framework español django google-app-engine django-rest-framework google-cloud-datastore

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.