Django模型(三)

本文详细介绍了Django中如何实现一对一、一对多、多对多以及自关联关系的数据库映射,包括OneToOneField、ForeignKey和ManyToManyField的用法,以及自关联在省市区级联和主播与粉丝关系中的应用。

一、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")
    

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟之编程

您的支持将成为我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值