在Django的Model中,可以定义多种关系:一对一,多对一/一对多,多对多。
分别为:
- 一对一:OneToOneField
- 多对一:ForeignKey
- 多对多:ManyToManyField
可以更加natural的表述为:
- 多个属于一个,即 belong to : ForeignKey,多个属于一个
- 一个有一个,即 only has one: OneToOneField
- 一个有很多个,即 has many: lots of A belong to B 与 B has many A,在建立 ForeignKey 时,另一个表会自动建立对应的关系
- 一个既有很多个,又属于很多个,即 has many and belong to : ManyToManyField,同样只能在一个model类中说明,关联表会自动建立。
在官方的tutorial中,有这样一个例子:
import datetime from django.db import models from django.utils import timezone class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text
在Model定义中表现了如下一对多关系:
|---- Choice 1 | Question 1 ----|---- Choice 2 | |---- Choice 3
我们可以看到,在“多”的一方(Choice)中定义了“一”的一方(Question)的外键。
当从“多”的一方展开查询时,只需要指明属性名即可
>>> c = Choice.objects.get(id=1) >>> c.question
当从“一”的一方展开查询时,则需创建一个foo_set集合:
>>> q = Question.objects.get(id=1) >>> q.choice_set.all()
对于多对多关系,其实和一对多非常的像,定义ManyToManyField的Model访问和它关联的Model时,直接访问该Model的名字就可以了,反过来,就需要加上“_set”了。
参考:http://logic0.blog.163.com/blog/static/18892814620137343447299/