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"
},
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"
},
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"
},