Django数据库一对多数据关系

本文主要描述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提供的用于通过主模型(父表)对象访问子模型(子表)对象集合的属性名。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 一对多查询优化主要包括两个方面:预先加载和选择关联查询。 1. 预先加载(Prefetch) 预先加载是 Django 对象关系映射(ORM)的一个重要特性,用于减少 SQL 查询次数。它可以在查询主模型时,同时查询其关联模型的数据,而不是在后续使用时频繁查询数据库。 例如,一个 `Book` 模型和一个 `Author` 模型之间是一对多关系,如果要查询所有书籍以及每本书的作者,可以使用 `prefetch_related()` 方法预先加载所有作者的数据: ```python books = Book.objects.all().prefetch_related('authors') ``` 这将通过两个 SQL 查询来实现,第一个查询获取所有书籍的数据,第二个查询获取所有作者的数据,并将其缓存到内存中以供后续使用。这样,当您需要访问每个书籍的作者时,Django 将从缓存中获取数据,而不是执行更多的 SQL 查询。 2. 选择关联查询(Select_related) 选择关联查询是另一个优化一对多查询的方法。它适用于查询与主模型相关联的一个外键模型,例如,如果要查询每本书的出版社名称,可以使用 `select_related()` 方法: ```python books = Book.objects.all().select_related('publisher') ``` 这将通过一个 SQL 查询来实现,查询所有书籍和它们的出版社,并将它们缓存起来。当您需要访问每个书籍的出版社时,Django 将从缓存中获取数据,而不是执行更多的 SQL 查询。 需要注意的是,`select_related()` 适用于外键关系,而 `prefetch_related()` 适用于多对多关系和反向关系。在使用这些方法时,需要考虑到查询的性能和内存消耗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值