Django REST Framework profundidad diferente para POST / PUT?

Estoy usando Django REST Framework para crear una API para mi aplicación web. Tengo una clase ‘Comentario’, que tiene la depth=2 establecida en la clase Meta . Esto funciona muy bien al obtener los Comments . Sin embargo, cuando trato de enviar una POST o PUT (es decir, crear un nuevo Comment ), me dicen que debo incluir objetos en lugar de identificadores de ForeignKey.

Aquí está mi clase Serializer:

 class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment depth = 2 

El modelo:

 class Comment(models.Model): user = models.ForeignKey(User, null=True, blank=True, related_name='comments') budget = models.ForeignKey(Budget, related_name='comments') published = models.BooleanField(default=False) body = models.TextField() created = models.DateTimeField(auto_now_add=True) 

El código de vista:

 class Comments(generics.ListCreateAPIView): model = Comment serializer_class = CommentSerializer def pre_save(self, obj): obj.user = self.request.user 

Y el error que se muestra en la salida (JSON) es:

 {"user": ["This field is required."], "budget": [{"non_field_errors": ["Invalid data"]}]} 

Cuando se envían estos datos en bruto:

 {"budget": 2, "published": true, "body": "Another comment"} 

Sé que esto es un poco tarde pero terminé usando 2 serializadores como:

 class CommentReadSerializer(serializers.ModelSerializer): class Meta: model = Comment depth = 2 class CommentWriteSerializer(serializers.ModelSerializer): class Meta: model = Comment 

Luego se usa así:

 class Comments(generics.ListCreateAPIView): model = Comment serializer_class = CommentReadSerializer def create(self, request, *args, **kwargs): serializer = CommentWriteSerializer(data=request.DATA, files=request.FILES) if serializer.is_valid(): self.pre_save(serializer.object) self.object = serializer.save(force_insert=True) self.post_save(self.object, created=True) headers = self.get_success_headers(serializer.data) serializer = CommentReadSerializer(serializer.object) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

Creo que la forma correcta de definir un campo de serializador que se refiere a una relación de clave externa es a través de algo como serializers.PrimaryKeyRelatedField . No creo que los serializadores modelo utilicen automáticamente esta clase de campo sin definirla explícitamente en la clase del serializador.

http://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield

Me imagino que un serializador PrimaryKeyRelatedField manejaría correctamente los envíos de datos JSON como el que usó en su ejemplo.

Puede configurar diferentes serializadores al anular la función get_serializer_class() , de esta manera:

def get_serializer_class(self): method = self.request.method if method == 'PUT' or method == 'POST': return YourWriteSerializer else: return YourReadSerializer

Pensé en agregar este, ya que vine aquí de Google después de un tiempo.