下面我将详细介绍一下 Django 模型层实现多表关系创建和多表操作的完整攻略,并提供两个示例实现。
1.多表关系创建
多表关系创建主要是通过外键关系来实现的,常见的外键关系有一对多关系和多对多关系。
1.1 一对多关系
1.1.1 示例1
例如,我们有两个模型类:Author
和Book
,一个作者可以写多本书,因此作者模型是一对多关系的主表,书籍模型是一对多关系的副表。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
注意到Book
模型类中,ForeignKey
字段表示外键关系,on_delete
表示删除关联表记录时的行为,这里我们采用的是级联删除。
1.1.2 示例2
另一个例子是电商系统中购物车和商品之间的关系,一个购物车中可以有多个商品,是一对多关系。
from django.db import models
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,)
time = models.DateTimeField(auto_now=True)
class CartItem(models.Model):
cart = models.ForeignKey(Cart, on_delete=models.CASCADE,)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=0)
总的来说,使用一对多关系需要在多的一方定义一个外键,指向一的一方的主键,并指定删除行为。
1.2 多对多关系
多对多关系在 Django 中使用ManyToManyField
类型来实现,它通过一个中间表来连接两个模型之间的关系。
1.2.1 示例1
例如,我们有两个模型类:Book
和Author
,一本书可以有多个作者,也可以一个作者写作多本书。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author)
def __str__(self):
return self.title
注意到Book
模型类中,ManyToManyField
字段指向了Author
模型类。Django 会自动创建一个名为book_authors
的中间表来保存两个模型之间的关系,我们无需在数据库中手动创建。
1.2.2 示例2
另一个例子是用户与组之间的关系。一个用户可以属于多个组,一个组也可以有多个用户。
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
def __str__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=100)
users = models.ManyToManyField(User)
def __str__(self):
return self.name
总的来说,使用多对多关系需要在其中一个模型中定义ManyToManyField
,随后Django会自动创建一个中间表关系,保存两个表之间的关系。
2.多表操作
在多表操作中,我们可以通过 Dango 的 ORM 查询相关表中的数据,以及进行相关的操作,如增加、删除、更新、查询等。
2.1 查询数据
我们可以使用filter
、get
等方法来进行查询,比如下面的例子是查询一个作者写的所有书籍:
books = Book.objects.filter(author__name='John')
其中author__name
表示连表查询,查询Book
表中外键关联的Author
表中作者名为John
的书籍。
2.2 增加数据
我们可以通过创建对象来添加一些数据,如下面的例子是添加了一个作者和他的一些书籍:
author = Author.objects.create(name='John', email='john@example.com')
book1 = Book.objects.create(title='My Book 1', author=author)
book2 = Book.objects.create(title='My Book 2', author=author)
2.3 更新数据
我们可以通过修改对象的属性来更新表中的数据,如下面的例子是修改某一本书的属性:
book = Book.objects.get(title='My Book 1')
book.title = 'New Title'
book.save()
2.4 删除数据
我们可以通过使用delete
方法来删除表中的数据,如下面的例子是删除某一本书:
book = Book.objects.get(title='My Book 1')
book.delete()
综上所述,我们可以使用 Django 的 ORM 来进行多表关系的创建与操作,使得跨表查询和数据的增删改查非常方便。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django模型层实现多表关系创建和多表操作 - Python技术站