一、 开篇:API的“社交困境”
想象一下,你是个刚出厂的Django模型,名叫UserProfile(用户档案)。你住在服务器的深闺大院里,每天最渴望的就是“被连接”——和其他模型交朋友,比如Post(帖子)或者Like(点赞)。
但现实很骨感。在传统的API设计中,你对外自我介绍(JSON响应)时,提到你的朋友Post,可能只能干巴巴地报上它的ID:“这是我的帖子,ID是...呃...42。” 前端小哥拿到这个ID,还得自己吭哧吭哧地拼接URL:https://api.example.com/posts/42/。这感觉,就像相亲只给了个身份证号,让对方自己去查户口本,太不优雅了!
这就是Django REST Framework (DRF) 关系和超链接API要解决的“核心痛点”:如何让我们的API响应变得“会来事儿”,能主动提供关联资源的链接,让前端小哥工作起来像开了导航一样顺畅。
今天,咱就用一个“虚拟约会平台”的示例,带你吃透Django模型的“社交法则”,把它们培养成API界的“交际花”。
二、 基础关系:模型的“三种社交方式”
在Django的模型世界里,交朋友主要有三种方式,对应数据库的三种关系。理解了它们,你就拿到了关系API的钥匙。
ForeignKey(一对多) - “霸道总裁式”
比如一个用户(UserProfile)可以发多篇帖子(Post),但一篇帖子只能属于一个用户。这就是经典的“一对多”。在Post模型里,你会定义一个ForeignKey指向UserProfile。翻译成大白话就是:“帖子,你只能有一个主人!”ManyToManyField(多对多) - “群聊式”
比如一个帖子(Post)可以被多个用户(UserProfile)点赞,一个用户也可以点赞多个帖子。这就是“多对多”。关系复杂了,数据库会自动创建一个中间表来记录谁点赞了谁。这就像一个大群聊,大家的关系错综复杂。OneToOneField(一对一) - “灵魂伴侣式”
比如一个用户(UserProfile)只能对应一个扩展的隐私设置(PrivacySettings),反之亦然。这种“你是我的唯一”的关系,就是一对一。它通常用于扩展主模型的信息。
三、 关系序列化器:DRF的“红娘”
模型层面确定了关系,接下来就看DRF的序列化器如何当“红娘”,把这些关系在API JSON里“官宣”出来。
DRF提供了几个超级好用的“关系字段”来搞定这事。
PrimaryKeyRelatedField(只给ID) - “务实直男型”
这是最基础的方式,在序列化器里,它只会输出关联对象的ID。
# serializers.py
class PostSerializer(serializers.ModelSerializer):
# 声明owner字段为PrimaryKeyRelatedField,表示只读
owner = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Post
fields = ‘id‘, ‘title‘, ‘content‘, ‘owner‘
输出效果:
{
"id": 1,
"title": "我的第一篇约会帖",
"content": "期待遇见有趣的你!",
"owner": 1 # 只给了一个用户ID
}
点评:简单直接,但前端需要自己拼链接,不够贴心。
StringRelatedField(只给名字) - “文艺青年型”
它会调用关联模型的__str__方法,输出一个字符串。比如

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



