Tengo un modelo muy simple y su serializador y vistas relacionados:
class Page(models.Model): user = models.ForeignKey(User) title = models.CharField(max_length=255) pub_date = models.DateTimeField(default=timezone.now) class PageSerializer(serializers.ModelSerializer): class Meta: model = Page fields = ('user', 'title', 'pub_date') class PageViewSet(viewsets.ModelViewSet): queryset = Page.objects.all() serializer_class = PageSerializerAhora puedo publicar así:
{ "user": 1, "title": "Lorem ipsum" }Esto funciona bien. Pero me gustaría publicar varios objetos como este:
[ { "user": 1, "title": "Lorem ipsum one" }, { "user": 1, "title": "Lorem ipsum two" } ]Pero esto me da un error:
"non_field_errors": [
"Invalid data. Expected a dictionary, but got list."]
Entonces, para aceptar múltiples objetos, modifiqué la vista según el documento :
class PageViewSet(viewsets.ModelViewSet): queryset = Page.objects.all() serializer_class = PageSerializer(queryset, many=True)Pero estoy recibiendo un error:
Error de tipo en /api/blog/pages/
El objeto 'ListSerializer' no se puede llamar
¿Que me estoy perdiendo aqui?
Lo tenía configurado correctamente antes, serializer_class debería apuntar a la clase de esta manera:
serializer_class = PageSerializerTenías razón en el error, no le gusta recibir múltiples objetos en el POST. Una forma de solucionarlo sería anular el método get_serializer en la vista, agregando many=True allí.
Algo como:
def get_serializer(self, *args, **kwargs): if "data" in kwargs: data = kwargs["data"] # check if many is required if isinstance(data, list): kwargs["many"] = True return super(PageViewSet, self).get_serializer(*args, **kwargs) Para responder a su pregunta en los comentarios: isinstance() es un método de Python para verificar el tipo de un objeto. En este caso, es una list cuando se pasan varios objetos, por lo que solo verificamos qué tipo data son y establecemos many=true si se trata de una list .