PrimaryKeyRelatedField

PrimaryKeyRelatedField を使用することでリレーションのあるテーブルのプライマリーキーを取得することが出来る。

class StatusSerializer(serializers.ModelSerializer):
    uri = serializers.SerializerMethodField(read_only=True)
    user = UserPublicSerializer(read_only=True)
    user_id = serializers.PrimaryKeyRelatedField(source='user', read_only=True)

    class Meta:
        model = Status
        fields = [
            'uri',
            'user_id',
            'id',
            'user',
            'content',
            'image'
        ]
        read_only_fields = ['user']
 "results": [
        {
            "uri": "http://127.0.0.1:8000/api/status/1/",
            "id": 7,
            "user_id": 1,
            "user": {
                "id": 1,
                "username": "test",
                "uri": "http://127.0.0.1:8000/api/user/test/"
            },
            "content": "do some stuff here",
            "image": "http://127.0.0.1:8000/media/status/test/images.png"
        },

DRF ドキュメント

HyperlinkedRelatedField

PrimaryKeyRelatedField を使用することでリレーションのあるテーブルのターゲットのハイパーリンクを取得することが出来る。

class StatusSerializer(serializers.ModelSerializer):
    uri = serializers.SerializerMethodField(read_only=True)
    user = UserPublicSerializer(read_only=True)
    user_id = serializers.HyperlinkedRelatedField(
        source='user', # user foreign key
        lookup_field='username',
        view_name='api-user:detail',
        read_only=True
    )

    class Meta:
        model = Status
        fields = [
            'uri',
            'id',
            'user_id',
            'user',
            'content',
            'image'
        ]
        read_only_fields = ['user']

view_name lookup_field リレーション関係にあるターゲット上のフィールド。 参照する view の URL キーワード引数と一致する必要がある。 デフォルトではpk

    "results": [
        {
            "uri": "http://127.0.0.1:8000/api/status/1/",
            "id": 7,
            "user_id": "http://127.0.0.1:8000/api/user/test/",
            "user": {
                "id": 1,
                "username": "test",
                "uri": "http://127.0.0.1:8000/api/user/test/"
            },
            "content": "do some stuff here",
            "image": "http://127.0.0.1:8000/media/status/test/images.png"
        },

DRF ドキュメント

HyperlinkedRelatedField

PrimaryKeyRelatedField を使用することでリレーションのあるテーブルのターゲットのハイパーリンクを取得することが出来る。

class StatusSerializer(serializers.ModelSerializer):
    uri = serializers.SerializerMethodField(read_only=True)
    user_id = serializers.HyperlinkedRelatedField(
        source='user', # user foreign key
        lookup_field='username',
        view_name='api-user:detail',
        read_only=True
    )
    user = serializers.SlugRelatedField(read_only=True, slug_field='username') 

    class Meta:
        model = Status
        fields = [
            'uri',
            'user_id',
            'id',
            'user',
            'content',
            'image'
        ]
        read_only_fields = ['user']
    "results": [
        {
            "uri": "http://127.0.0.1:8000/api/status/7/",
            "user_id": "http://127.0.0.1:8000/api/user/hshimizu/",
            "id": 7,
            "user": "hshimizu",
            "content": "do some stuff here",
            "image": "http://127.0.0.1:8000/media/status/hshimizu/images.png"
        },        

DRF ドキュメント