Django模型 一对一、一对多、多对多
1. 一对多关系(ForeignKey)
场景:一个作者可以写多本书,一本书只能属于一个作者(简化场景)。
class Author(models.Model):
name = models.CharField(max_length=30, verbose_name="作者名")
age = models.IntegerField(default=0, verbose_name="年龄")
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=50, verbose_name="书名")
# 关联Author,on_delete=CASCADE表示:若作者被删除,其所有书籍也被删除
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books", verbose_name="作者")
def __str__(self):
return self.title
关联查询:
- 正向查询(从 Book 查 Author):
book.author(获取书籍的作者) - 反向查询(从 Author 查 Book):
author.books.all()(通过related_name获取作者的所有书籍)
2. 多对多关系(ManyToManyField)
场景:一本书可以属于多个分类(如 “科幻”“小说”),一个分类可以包含多本书。
class Category(models.Model):
name = models.CharField(max_length=20, verbose_name="分类名")
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=50, verbose_name="书名")
# 多对多关联Category,自动生成中间表(book_category)
categories = models.ManyToManyField(Category, related_name="books", verbose_name="分类")
def __str__(self):
return self.title
关联操作:
- 添加关联:
book.categories.add(category1, category2) - 移除关联:
book.categories.remove(category1) - 查询关联:
book.categories.all()(书籍所属分类)、category.books.all()(分类下的书籍)
3. 一对一关系(OneToOneField)
场景:一个用户只能有一个个人资料,一个资料只能属于一个用户。
from django.contrib.auth.models import User # Django内置用户模型
class Profile(models.Model):
# 一对一关联User,on_delete=CASCADE表示:用户删除,资料也删除
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile", verbose_name="用户")
phone = models.CharField(max_length=11, blank=True, verbose_name="手机号")
address = models.CharField(max_length=100, blank=True, verbose_name="地址")
def __str__(self):
return f"{self.user.username}的资料"
关联查询:
- 正向查询:
profile.user(获取资料对应的用户) - 反向查询:
user.profile(通过related_name获取用户的资料)
浙公网安备 33010602011771号