Django ORM – 多表实例


Django ORM – 多表实例

在Django模型中,一个模型可以很容易地与另一个模型建立关系。这种关系可以在模型之间创建外键、同一个模型的多个实例之间的关系以及多对多关系。

外键:

当一个模型的一个字段定义为另一个模型的主键时,就创建了一个外键。例如,有一个“作者”模型和一个“文章”模型。每篇文章都有一个作者,因此可以将“文章”模型的“作者”字段定义为“作者”模型的主键:

class Author(models.Model):
    name = models.CharField(max_length=50)

class Post(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在上面的例子中,每个帖子都必须由一个作者编写。我们可以通过以下方式获取“文章”模型中每篇文章的作者的名称:

for post in Post.objects.all():
    print(post.author.name)

同一个模型的多个实例之间的关系:

在某些情况下,模型实例之间的关系并不是简单的父子关系。例如,一个人可能会成为某个组织的成员,在这种情况下,同一个模型的多个实例需要建立关系。可以通过在模型中定义一个字段来处理此类关系。例如:

class Person(models.Model):
    name = models.CharField(max_length=50)
    organization = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)

在上面的例子中,每个人可以属于一个组织,这个组织可以是另一个人或它也可以是自己。如果一个人没有属于任何组织,那么它的组织将被设置为null。我们可以通过以下方式获取某个人所属组织的名称:

person = Person.objects.get(name='Joe')
if person.organization:
    organization_name = person.organization.name
else:
    organization_name = 'None'
print(organization_name)

多对多关系:

多对多关系允许一个模型实例与多个另一个模型实例建立关系。例如,一个学生可以报名参加多个课程,同时,每个课程也可以有多名学生。可以通过在模型中定义一个ManyToManyField来处理此类关系。例如:

class Student(models.Model):
    name = models.CharField(max_length=50)
    courses = models.ManyToManyField('Course', related_name='students')

class Course(models.Model):
    name = models.CharField(max_length=50)

在上面的例子中,每个学生可以报名参加多个课程,每个课程也可以有多名学生。我们可以通过以下方式获取每个课程所拥有的学生:

course = Course.objects.get(name='math')
students = course.students.all()
for student in students:
    print(student.name)

以上就是Django ORM多表实例的简单介绍,学会了多表实例的使用可以更加方便的处理数据库操作,并且能够帮助我们更好的实现网站的功能需求。