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多表实例的简单介绍,学会了多表实例的使用可以更加方便的处理数据库操作,并且能够帮助我们更好的实现网站的功能需求。