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获取用户的资料)
posted @ 2018-08-01 19:09  xclic  阅读(1899)  评论(0)    收藏  举报