本文介绍: ”’人”””学习的语言”’# 建立多对多管理的使用Person,through = ‘PersonLanguage’, # 这是一个字符串,”’人学了哪门语言”’

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

原文地址:https://blog.csdn.net/Calor13/article/details/135904564

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_64377.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注