第一章:欢迎来到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)就像导师带研究生——一个导师能带多个学生,但每个学生只能有一个正牌导师。
让我们用博客系统来演示这个关系:

最低0.47元/天 解锁文章

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



