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'子串