Django Model一对多、多对多关系

在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/

http://blog.csdn.net/hackerain/article/details/39838559

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注