Django-Rest-Framework序列化器类元选项

19

当我在一个元模型类中使用两个模型时,运行代码时会出现错误。如何使用这些模型呢?这是一个Django Rest的示例。

from rest_framework import serializers
from .models import Post,Miembros

class PostSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Post
        fields = ('id', 'url', 'titulo', 'contenido','fecha_evento','fecha_evento','banner_grande','lugar')

        model = Miembros
        fields = '__all__'

在/api/posts/页面发生了TypeError错误。选项fields必须是列表或元组类型。但目前是字符串类型。请求方法为GET。请求URL为http://127.0.0.1:8000/api/posts/。Django版本为1.8.3。异常类型为TypeError,异常信息为“选项fields必须是列表或元组类型。但目前是字符串类型。”异常位置在rest_framework/serializers.py的get_field_names函数的第900行。Python执行文件路径为/home/root-master/restcosolg/cslg/bin/python,版本号为2.7.6。


1
你是否尝试添加Miembros的所有字段成员,就像在post模型中所做的那样,以查看是否存在问题,或者是否出现相同的错误? - ivan7707
2个回答

29

我知道这个答案是在问题被问出几年后才出现的,但我遇到过这种情况几次。由于某些原因,它希望是一个列表而不是单个值。

因此,如果您不想使用__all__值,但是您的模型中只有1个值,则需要确保字段部分有一个逗号“,”:

class Meta:
        model = Post
        fields = ('id',)

救命稻草!是的,逗号语法对我来说是个问题。 - Fintan Kearney

17

更新(2016年5月5日):

fields__all__值在ModelSerializer现已支持(感谢@wim指出)。

您还可以fields属性设置为特殊值'__all__',以表示应使用模型中的所有字段。

如果您只想在模型序列化器中使用默认字段的子集,则可以使用fieldsexclude选项,就像使用ModelForm一样。强烈建议您明确设置应使用fields属性进行序列化的所有字段。这将使在模型更改时意外暴露数据的可能性降低。

看起来你正在尝试将Django ModelForm的fields属性与DRF序列化器的fields属性混合使用。
在DRF序列化器中,__all__fields属性的无效值。

其次,你不能在一个Meta类中指定多个模型。你需要使用两个单独的序列化器并将它们附加在一起。

例如,你可以像下面这样做:

from rest_framework import serializers
from .models import Post,Miembros


class MiembrosSerializer(serializers.ModelSerializer):
    """
    serializer for Miembros model
    """

    class Meta:
        model = Miembros 
        fields = '__all__' # all model fields will be included


class PostSerializer(serializers.HyperlinkedModelSerializer):
    """
    serializer for Post model
    """

    miembros = MiembrosSerializer()

    class Meta:
        model = Post
        fields = ('id', 'url', 'titulo', 'contenido','fecha_evento','fecha_evento','banner_grande','lugar')

1
看起来这个答案已经过时了。DRF现在支持'__all__'的djangoism - wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接