Django REST框架GET嵌套序列化程序产生错误:'RelatedManager'对象没有属性'datafile_set'"

Bor*_*kov 4 django rest django-rest-framework

我有一个2级深度的嵌套序列化器:

class ToolSerialier(serializers.ModelSerializer):
    input = ToolInputSerializer()

    class Meta:
        model = Tool
        fields = ('docker_image', 'input')

class ToolInputSerializer(serializers.ModelSerializer):
    datafile_set = ToolInputDatafileSerializer(many=True)

    class Meta:
        model = ToolInput
        fields = ('datafile_set', )

class ToolInputDatafileSerializer(serializers.ModelSerializer):
    class Meta:
        model = ToolInputDatafile
        fields = ('name', 'file')
Run Code Online (Sandbox Code Playgroud)

和各自的型号:

class Tool(models.Model):
    docker_image = models.CharField(max_length=255, null=True, blank=True)

class ToolInput(models.Model):
    tool = models.ForeignKey(Tool, related_name="input")

class ToolInputDatafile(models.Model):
        tool_input = models.ForeignKey(ToolInput, related_name="datafile_set")
        name = models.CharField(max_length=255)
        file = jsonfield.JSONField()
Run Code Online (Sandbox Code Playgroud)

现在,当我向ToolSerializers列表端点发送GET请求时,收到一条错误消息:

AttributeError at /api/tool/

Got AttributeError when attempting to get a value for field `datafile_set` on serializer `ToolInputSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `RelatedManager` instance. 
Original exception text was: 'RelatedManager' object has no attribute 'datafile_set'.
Run Code Online (Sandbox Code Playgroud)

显然,由于某种原因,get()没有调用RelatedManagerToolInput的方法,并且它无法访问datafile_set属性.

为什么?我应该介绍什么修复?

Lin*_*via 6

你错过了一个many=True论点:

class ToolSerialier(serializers.ModelSerializer):
    input = ToolInputSerializer(many=True)
Run Code Online (Sandbox Code Playgroud)

这是必需的,因为你有一个反向的FK.

  • 但是我不希望它很多= True :)在这种情况下,这是一对一的关系。有什么办法可以保持它一对一?谢谢您的回答,顺便说一句。 (2认同)