Django中的ORM

ORM查询

最近在学习django的时候遇到了问题,以为自己弄懂了,结果再展示内容的时候又犯了错。所以我又查询资料,牢牢的巩固一下,把之前的盲点都解决。

1.关系

这里简单描述一下什么是一对一、一对多、多对多的关系。

  •   一对一:

  • 一对多:

 

  • 多对多:

      ​​​​​​​

我觉得上面这三个图能够很好的展示它们之间的关系。我这里就不赘述了。

2.概念

  • 子表、父表:

​​​​​​​子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择。总之,外键设在哪个表里,哪个表就是父表。就像父亲和儿子的关系。

  • 正向查询、反向查询:​​​​​​​

拿父子关系举例。对于一对多来说:

正向查询就是根据儿子找父亲,只能找到一个(这里的父亲有多个儿子)。

反向查询就是根据父亲找儿子,能找到多个儿子

3.举例

models:

class Colors(models.Model):
    yanshe = models.CharField(max_length=10)  # 蓝色
    depth = models.CharField(max_length=20)   # 颜色的深度
    def __str__(self):
        return self.yanshe

class Ball(models.Model):
    color = models.OneToOneField("Colors")  # 与颜色表为一对一,颜色表为母表
    description = models.CharField(max_length=10)  # 描述
    size = models.CharField(max_length=10)   #大小
    def __str__(self):
        return self.description

class Clothes(models.Model):
    colors = models.ForeignKey("Colors")  # 与颜色表为外键,颜色表为母表
    style = models.CharField(max_length=10)  # 描述
    duixiang = models.CharField(max_length=10)
    def __str__(self):
        return self.style

class Child(models.Model):
    name = models.CharField(max_length=10)  # 姓名
    age = models.IntegerField()   #年龄
    color = models.ManyToManyField('Colors', through="ChildColors")  # 与颜色表为多对多
    def __str__(self):
        return self.name

class ChildColors(models.Model):
    child = models.ForeignKey(Child)
    color = models.ForeignKey(Colors)   # 多对多那个表什么都不用return

view:

# 一对一查询  正向查询   这里查询的是 根据子表Ball的description 去查父表Colors的颜色深度
colorss = Ball.objects.get(description='黄色的球很黄')
# 解释:因为是本表,所以括号里直接填字段就行
# 一对一查询  反向查询  这里根据Color的yanshe 去查子表的 描述
balls = Ball.objects.get(color__yanshe='蓝色')
# 解释:括号里面的数据 Ball里面的字段 双下划线 Colors类里的字段
# 一对多查询  正向查询  这里查询的是 根据Clothes表的样式 查询Colors表的颜色
colth = Clothes.objects.get(style='帽子')
# 解释: 正向查询好查,注意的是这里的得到一个clothes对象
# 一对多查询   反向查询    # 这里查的是  根据Colors表里的颜色深浅 来查询衣服的style(样式)
clothes2 = Clothes.objects.filter(colors__depth='高')
# 解释:括号的内容是:外键字段__外表的字段
# 1.一对多查询 不论正向还是反向 都还是实例那个有外键 的表
# 2. 注意一对多反向查询 是父查子 所以有多个对象 ,要用filter

# 多对多查询  正向查询  # 这里查的是   根据小孩名字去父表查喜欢的颜色
colors = Colors.objects.filter(child__name='小北')
# 多对多查询  反向查询  # 这里查的是根据 颜色深度 去查孩子的姓名
child2 = Child.objects.filter(color__depth='中')
# 解释:正向反向 其实用了同一种方法(反向查询) 要查啥,就实例化哪个表,然后筛选字段以外表的方式筛选

在这里我把所有的解释,放在了代码里。因为这样写,每行代码都解释很详细。

html:

一对一 正向查询:
{{colorss.color.depth}}  <br>
一对一 反向查询:
{{ ball.description }}<br>
一对多 正向查询:
{{colth.colors.yanshe}} <br>
一对多 反向查询:
{% for clothes in clothes2 %}
    {{clothes.style}}
{% endfor %}<br>
多对多正向查询
{% for color in colors %}
    {{color.yanshe}}
{% endfor %}
<br>
多对多反向查询
{% for child in child2 %}
    {{child.name}}
{% endfor %}

4.总结

1.一对一查询 不论是正向还是反向都用get ,原因是结果只有一个(一对一嘛)
2. 一对一、一对多 实例化的对象是有外键的那个表
3. 筛选字段 如果是本表的话,就直接写. 如果是另一个表的话就(外键__外表的字段
4.注意 这里得到的都是一个对象  colth = Clothes.objects.get(style='帽子')

5.在多对多查询要注重查的是谁,查谁就实例化谁的类。并且正向查询是:外表表名__外表字段  反向查询是 外键__外表字段

5.纠错

之前我犯了个错,看一份资料说用get方法会取得对象,如果这个对象不存在的话 就会报错。而用filter就不会出现这种情况,所以我习惯用filter 根据我犯的错得出的结论是 子表查父表 只能用get

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值