django学习-数据表关系

文章目录

      • 一、数据表关系
        • [1. 一对一关系](#1. 一对一关系)
        • [2. 一对多关系](#2. 一对多关系)
        • [3. 多对多关系](#3. 多对多关系)

一、数据表关系

一个模型对应数据库的一张数据表,但是每张数据表之间是可以存在外键关联的,表与表之间有3种关联:一对一、一对多和多对多。

1. 一对一关系

一对一关系存在于两张数据表中,第一张表的某一行数据只与第二张表的某一行数据相关,同时第二张表的某一行数据也只与第一张表的某一行数据相关,这种表关系被称为一对一关系。

在模型中可以通过OneToOneField来构建数据表的一对一关系,代码如下:

复制代码
# models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)  # 此处进行了用户一对一关系对应
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=100, blank=True)
    birth_date = models.DateField(null=True, blank=True)

    def __str__(self):
        return f'{self.user.username}\'s profile'

class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()
    date_joined = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.username
2. 一对多关系

一对多关系存在于两张或两张以上的数据表中,第一张表的某一行数据可以与第二张表的一到多行数据进行关联,但是第二张表的每一行数据只能与第一张表的某一行进行关联。

这种表关系在日常开发中最为常见。在模型中可以通过ForeignKey来构建数据表的一对多关系,代码如下:

复制代码
# models.py

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)  # 此处与作者模型建立了一对多关系
    published_date = models.DateField()

    def __str__(self):
        return self.title
3. 多对多关系

多对多关系存在于两张或两张以上的数据表中,第一张表的某一行数据可以与第二张表的一到多行数据进行关联,同时第二张表中的某一行数据也可以与第一张表的一到多行数据进行关联。

注意: 数据表之间创建多对多关系时,只需在项目里定义两个模型对象即可,在执行数据迁移时,Django自动生成3张数据表来建立多对多关系。

在模型中可以通过ManyToManyField来构建数据表的多对多关系,代码如下:

复制代码
# models.py

class Student(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Course(models.Model):
    name = models.CharField(max_length=100)
    students = models.ManyToManyField(Student)  # 在这个地方建立了与student模型的多对多关系

    def __str__(self):
        return self.name

综上所述,模型之间的关联是由OneToOneFieldForeignKeyManyToManyField外键字段实现的,每个字段设有特殊的参数,常见参数说明如下:

参数 说明
to 必选参数,关联的模型名称。
on_delete 必选参数,设置数据的删除模式,删除模型包括:CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET和DO_NOTHING。
limit_choices_to 设置外键的下拉框选项,用于模型表单和Admin后台系统。
related_name 用于模型之间的关联查询,如反向查询。
related_query_name 设置模型的查询名称,用于filter或get查询,若设置参数related_name,则以该参数为默认值,若没有设置,则以模型名称的小写为默认值。
db_table 仅限于ManyToManyField,为管理和存储多对多关系的数据表设置表名称。
相关推荐
382427827几秒前
python3网络爬虫开发实战 第二版:绑定回调
开发语言·数据库·python
im_AMBER3 分钟前
Leetcode 87 等价多米诺骨牌对的数量
数据结构·笔记·学习·算法·leetcode
好奇龙猫6 分钟前
【AI学习-comfyUI学习-第二十一-LMSD线段预处理器(建筑概念设计图)-各个部分学习】
人工智能·学习
wniuniu_13 分钟前
ceph的参数
java·数据库·ceph
一只专注api接口开发的技术猿23 分钟前
智能决策数据源:利用 1688 商品详情 API 构建实时比价与供应链分析系统
大数据·前端·数据库
dog25029 分钟前
基于历史学习的拥塞控制算法
学习·拥塞控制
山峰哥31 分钟前
SQL查询优化秘籍:从Explain分析到性能飞跃
开发语言·数据库·sql·oracle·性能优化·系统优化
刘一说32 分钟前
MySQL 版本演进全景图:从 5.6 到 8.4 的技术变革与行业实践
数据库·mysql
风跟我说过她34 分钟前
HBase完全分布式部署详细教程(含HA高可用版+普通非HA版)
大数据·数据库·分布式·centos·hbase
writeone41 分钟前
数据库课后题重点摘要
数据库·oracle