Django基础教程(三十五)Django数据模型的设计与实现之模型关系字段:当Django模型开始“相亲”:一场字段关系的硬核相亲大会

第一章:欢迎来到Django模型“相亲角”

想象一下,你是个数据库世界的红娘,手头有一堆急着找对象的数据表。用户表想找个人资料表,文章表需要勾搭标签表,商品表要和订单表搞暧昧……这时候,Django模型关系字段就是你手中的“姻缘簿”,专门负责给这些数据表牵线搭桥!

作为一个懒人框架(这是夸奖!),Django深谙“不要重复造轮子”之道。它的模型关系设计,让原本需要写复杂SQL外键关联的活儿,变成了几行Python代码就能搞定的小case。今天,就让我们把这个“相亲角”的运营秘籍彻底扒个明白!

先来搭建我们的演示环境:

# models.py 开篇
from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    """用户扩展资料表 - 准备找对象的一号嘉宾"""
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    wechat_id = models.CharField(max_length=50)
    
    def __str__(self):
        return f"{self.user.username}的资料"

看到那个OneToOneField了吗?这就是我们的第一位“月老”,专门负责一对一牵线。别急,接下来还有更精彩的!

第二章:一对一关系 - 数据界的“一生一世一双人”

一对一关系,堪称数据表界的“初恋配置”——专一、排他、眼里容不下第二个人。就像每个人只能有一个身份证,每个User模型也只能对应一个UserProfile。

来,看看我们怎么给用户和用户资料“牵红线”:

# 继续在models.py中
def get_default_user_profile():
    """默认用户资料 - 就像相亲时的备胎"""
    return {"wechat_id": "unknown"}

class UserProfile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,  # 用户没了,资料也跟着删除
        primary_key=False,  # 默认不是主键
        related_name='profile',  # 反向查询的名字,超重要!
    )
    avatar = models.ImageField(upload_to='avatars/', null=True)
    bio = models.TextField(max_length=500, blank=True, default="这个人很懒,什么都没写")
    
    class Meta:
        db_table = 'user_profile'  # 自定义表名,显得专业
        
# 实际使用示例
def user_operation_example():
    # 创建用户
    user = User.objects.create_user('zhangsan', 'zs@example.com', 'pass123')
    
    # 创建资料
    profile = UserProfile.objects.create(user=user, wechat_id='zhangsan123')
    
    # 正向查询:通过用户找资料
    print(user.profile.wechat_id)  # 输出: zhangsan123
    
    # 反向查询:通过资料找用户
    print(profile.user.username)  # 输出: zhangsan

重点来了:那个on_delete=models.CASCADE就像是定下的“生死契”——如果User被删除,UserProfile也会跟着殉情。除此之外,还有其他几种“分手模式”:

  • PROTECT:保护模式,阻止删除
  • SET_NULL:设置为空,留个念想
  • SET_DEFAULT:恢复默认值,好聚好散
  • DO_NOTHING:啥也不干,最无情的选择

第三章:一对多关系 - 数据界的“导师带徒弟”

如果说一对一像婚姻,那一对多(ForeignKey)就像导师带研究生——一个导师能带多个学生,但每个学生只能有一个正牌导师。

让我们用博客系统来演示这个关系:


                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

值引力

持续创作,多谢支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值