Django模型(三)

一、1对1关系映射

image-20220929184311876

关系型数据库的强大之处在于各表之间的关联关系。 Django 提供了定义三种最常见的数据库关联关系的方法:多对一,多对多,一对一

一对一关联使用 OneToOneField来定义一对一关系

就像使用其他类型的 Field 一样:在任意一边模型属性中包含它

from django.db import models


class Place(models.Model):
  name = models.CharField(max_length=50)
  address = models.CharField(max_length=80)


  def __str__(self):
    return "%s the place" % self.name


class Restaurant(models.Model):
  place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    primary_key=True,
   )
  # BooleanField 在数据库使用 tinyint 类型
  serves_hot = models.BooleanField(default=False)
  serves_clod= models.BooleanField(default=False)


  def __str__(self):
    return "%s the restaurant" % self.place.name

二、1对多关系映射

image-20220929185911417

定义一个多对一的关联关系,使用 django.db.models.ForeignKey 类。就和其它 Field字段类型一样,只需要在你模型中添加一个值为该类的属性

ForeignKey类需要多的一方添加一个参数,即你想要关联的模型类名

from django.db import models


class Place(models.Model):
  name = models.CharField(max_length=50)
  address = models.CharField(max_length=80)


  def __str__(self):
    return "%s the place" % self.name


class Restaurant(models.Model):
  place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    primary_key=True,
   )
  # BooleanField 在数据库使用 tinyint 类型
  serves_hot_dogs = models.BooleanField(default=False)
  serves_pizza = models.BooleanField(default=False)


  def __str__(self):
    return "%s the restaurant" % self.place.name


class Waiter(models.Model):
  restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
  name = models.CharField(max_length=50)


  def __str__(self):
    return "%s the waiter at %s" % (self.name, self.restaurant)

三、多对多关系映射

image-20220929190350564

定义一个多对多的关联关系,使用 django.db.models.ManyToManyField 类。就和其他Field字段类型一样,只需要在你模型中添加一个值为该类的属性

ManyToManyField类需要任意模型边添加一个位置参数,即你想要关联的模型类名

class SchoolClass(models.Model):
  name = models.CharField(max_length=20)


class Teacher(models.Model):
  name = models.CharField(max_length=10)
  school_class = models.ManyToManyField(SchoolClass)

四、多对多关系自定义中间表

image-20220929203829099

from django.db import models


class Person(models.Model):
  '''
   人
   '''
  name = models.CharField(max_length=32)
  
class Language(models.Model):
  '''
   学习的语言
   '''
  name = models.CharField(max_length=32)
  # 建立多对多管理的使用
  person_language = models.ManyToManyField(
    Person,
    through = 'PersonLanguage', # 这是一个字符串,
   )


class PersonLanguage(models.Model):
  '''
   人学了哪门语言
   '''
  person = models.ForeignKey(Person,on_delete=models.CASCADE)
  language = models.ForeignKey(Language,on_delete=models.CASCADE)
  level = models.IntegerField(default=1)

五、自关联

image-20220929211600572

自关联就是外键指向自己表模型

5.1、一对多应用

省市区级联

image-20220929212512732

from django.db import models


class Area(models.Model):
  name = models.CharField(max_length=32)
  pid = models.ForeignKey('self', on_delete=models.CASCADE)

5.2、多对多应用

  • 主播与粉丝的关系
  • 链接与友情链接
    from django.db import models
    
    
    class Person(models.Model):
      friends = models.ManyToManyField("self")