Django 休息框架 - PrimaryKeyRelatedField

dow*_*123 9 django django-rest-framework

我正在关注 Django REST 框架教程,此时我在这里:http : //www.django-rest-framework.org/tutorial/4-authentication-and-permissions#adding-endpoints-for-our-user -楷模

我的 UserSerializer 代码如下所示:

class UserSerializer(serializers.ModelSerializer):
    snippets = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = User
        fields = ('id', 'username', 'snippets')
Run Code Online (Sandbox Code Playgroud)

我试图了解到底什么是 PrimaryKeyRelatedField。为此,我正在按如下方式更改代码并刷新 URLhttp://127.0.0.1:8000/users/以查看不同的输出

变体 1

snippets = serializers.RelatedField(many=True, read_only=True)


{
    "count": 1, 
    "next": null, 
    "previous": null, 
    "results": [
        {
            "id": 1, 
            "username": "som", 
            "snippets": [
                "Snippet title = hello", 
                "Snippet title = New2"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是打印出__unicode__()片段的值。我期待这个

变体 2 - 使用 PrimaryKeyRelatedField

snippets = serializers.PrimaryKeyRelatedField(many=True, read_only=True)


{
    "count": 1, 
    "next": null, 
    "previous": null, 
    "results": [
        {
            "id": 1, 
            "username": "som", 
            "snippets": [
                1, 
                2
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这会打印出两个片段的主键 ID -我不明白这一点

变体 3 - 注释掉也会产生

#snippets = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

{
    "count": 1, 
    "next": null, 
    "previous": null, 
    "results": [
        {
            "id": 1, 
            "username": "som", 
            "snippets": [
                1, 
                2
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

Car*_*son 13

来自序列化程序文档

默认的 ModelSerializer 使用主键建立关系

如果您没有指定任何自己PrimaryKeyRelatedField将在幕后使用的内容,那么您的变体 2 就是预期的输出。

希望这有帮助。