web开发学习(9) - Django之关联关系

Django提供了三种关联关系的方法:

  • many to one
  • many to many
  • one to one

1. many-to-one

使用django.db.models.ForeignKey进行关联:

from django.db import models

class product(models.Model):
      product_name = models.CharField(max_length=80)
      price = models.IntegerField()

class order(models.Model):
      products = models.ForeignKey(product, on_delete = models.CASCADE)
      order_num = models.IntegerField()

如何创建关系 :add()、create()、set()

2. many-to-many

什么是多对多的关系,举个例子,pizza和配料之间就属于这种关系:一种pizza有多种配料,一种配料也可能用于制作多种pizza

from django.db import models

class Topping(models.Model):
    pass

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping)

在多对多(many-to-many)关系中添加添加额外的属性字段:再建一个表,用于记录与这两个表相关的额外的信息,这张新建的表叫中间模型,通过through参数来做关联,models.ManyToManyField(Topping, through='Order')

from django.db import models

class Topping(models.Model):
    pass

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping,through='order')   #通过through参数指定中间模型

class Order(models.Model):
    customer_id = IntegerField()
    order_date = DateTimeField()
    pizza = models.ForeignKey(Pizza, on_delete = models.CASCADE)   #使用外建关联多对多关系的两端
    toppings = models.ForeignKey(Topping, on_delete = models.CASCADE)

多对多关系(带中间模型)相关操作关系必须通过中间模型来实现,而不能通过两端直接建立联系

top1 = Topping(**kwarg)
top2 = Topping.objects.create(**kwarg)  

p1 = Pizza(**kwarg)
p2 = Pizza.objects.create(**kwarg)

order1 = Order(pizza=p1,toppings=top1,**kwargs)      #通过实例化中间模型,来建立多对多两端关系

order1.pazza.all()
order1.toppings.all()
top1.pizza_set.all()
pizza.topping_set.all()

3. 在关系之间进行的查询操作

参考:https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/#lookups-that-span-relationships

相当于SQL语句中的JOIN操作

Blog.objects.filter(entry__headline__contains='Lennon')  #用双下划线连接,entry对象的headline属性包含有'Lennon'子串

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值