Django数据库一对多数据关系

时间:2022-06-01 22:04:45

本文主要描述Django数据中一对一的数据关系,创建app等配置不再赘述。

Django操作数据库,使用ORM

ORM:关系映射对象,把传统的SQL语句封装成了类和对象的形式,在操作表中的记录时,就像在操作类和对象一样。

使用默认数据库:sqlite

操作在models.py文件中完成。

一对多数据关系:

一对多关系是通过‘子表’中设置‘父表’的外键约束来完成关联

父表的一个数据对应子表中的多个数据

举例:班级和学生

class Classes(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=10, null=True)  # 班级名称
    num = models.IntegerField(null=True)  # 班级人数

    class Meta:
        db_table = 'Classes'

    def __unicode__(self):
        return 'classname:%s | classnum:%s' % (self.name, self.num)


class Student(models.Model):
    id = models.AutoField(primary_key=True)
    # 关联‘父表’,设置外键
    classes = models.ForeignKey(Classes, on_delete=models.CASCADE)
    name = models.CharField(max_length=20, null=True)
    age = models.IntegerField(null=True)

    class Meta:
        db_table = 'Student'

    def __unicode__(self):
        return 'studentname:%s | studentage:%s' % (self.name, self.age)

创建完数据库模型之后,我们要创建数据库变更文件以及应用表更文件等操作,具体操作步骤,参考上篇文章《Django数据库一对一数据关系》


对数据表中数据的查询操作

1)从子表中查询父表的数据

print  s1.classes.num 学生在所在班级的总人数

print s1.classes 学生所在班级的所有信息


2)从父表中查询子表的相关数据

1. 查询一个班级的所有学生,通过student_set属性查询

print c1.student_set.all()

2.filter:根据条件,去结果集中进行匹配查询

print c1.student_set.filter(name='lisi')

3. get :根据条件,去结果集中进行匹配查询

print  c1.student_set.get(name='lisi')


get()和filter()方法的区别

get():只能查询出一个结果,如果查询的结果不止一个,name使用get()方法会报错

filter():可以根据条件,匹配一组结果,得到一个结果集


XXX.set :Django提供的用于通过主模型(父表)对象访问子模型(子表)对象集合的属性名。