Django基础教程(121)Django关系和超链接API:Django API社交指南:让你的模型告别“单身狗”,秒变关系达人!

一、 开篇: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的钥匙。

  1. ForeignKey (一对多) - “霸道总裁式”
    比如一个用户(UserProfile)可以发多篇帖子(Post),但一篇帖子只能属于一个用户。这就是经典的“一对多”。在Post模型里,你会定义一个ForeignKey指向UserProfile。翻译成大白话就是:“帖子,你只能有一个主人!”
  2. ManyToManyField (多对多) - “群聊式”
    比如一个帖子(Post)可以被多个用户(UserProfile)点赞,一个用户也可以点赞多个帖子。这就是“多对多”。关系复杂了,数据库会自动创建一个中间表来记录谁点赞了谁。这就像一个大群聊,大家的关系错综复杂。
  3. 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__方法,输出一个字符串。比如
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值