首页 > 其他分享 >django中的主表和从表

django中的主表和从表

时间:2023-04-24 19:00:53浏览次数:45  
标签:从表 models Django 外键 关联 对象 django 主表

一、主表和从表

在 Django 中,ORM 的关系模型中,有主表和从表之分。其中,主表又称为“一方表”,从表也称为“多方表”。这里举个简单的例子:假设有两个模型 Blog 和 Entry,每个 Blog 包含多个 Entry

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateTimeField()
    mod_date = models.DateTimeField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在上述代码中,Blog 是主表,Entry 是从表。

主要有以下几点需要注意:

  1. 多方表需要定义一个外键关联到一方表,以明确两者间的关系,上述代码中 Entry 模型中 blog 字段就是一个外键;
  2. 一方表对象可以通过外键字段名字访问到其从表中的所有对象,比如 blog.entry_set.all() 就可以获取到指定 blog 下的所有 Entry 对象;
  3. 在使用 ForeignKey 定义外键时,必须指定 on_delete 参数,表示当该外键关联的主键被删除时,从表中的相关记录的处理方式。

以上只是简单地介绍了 Django ORM 中的主表和从表以及外键的用法,实际情况下,还涉及到表和字段的命名约定、级联操作等等问题。

 

二、外键关联

在 Django 中,外键关联到其他模型时,需要指定 ForeignKey 字段的 on_delete 属性,该属性表示当关联的对象被删除时,该如何处理外键值。on_delete 的值是一个字符串,可选的值如下:

都将被删除。这通常是最常见的行为。

PROTECT:防止执行外键关联的对象被删除。如果试图删除外键对象,Django 将引发 ProtectedError。

SET_NULL:将外键的值设置为 NULL,并且只有当关联对象的 null=True 时才能使用。这意味着当外键关联的对象被删除时,外键上的值将不再引用任何对象。

SET_DEFAULT:将外键的值设置为 默认值,并且只有当关联对象的 default 参数设置时才能使用。当关联对象被删除时,Django 会尝试使用关联模型的 default 值来替换当前外键。

SET():将外键的值设置为指定的值,并且只有当关联对象的 null=True 或 default 参数设置时才能使用,SET() 需要传入一个可调用对象,来计算新外键的值。

DO_NOTHING:什么都不做。在这种情况下,如果尝试删除外键关联的对象,这个操作将会引发完整性错误,并且数据库行为将会定义在数据库引擎级。这可能会导致 Django 的行为与数据库期望的行为不同,这可能会产生潜在的问题。

总之,使用 on_delete 是很重要的,因为它可以避免遗留数据。每个 Django 项目都可能需要不同的行为,所以必须根据项目的需求选择适当的行为。

 

标签:从表,models,Django,外键,关联,对象,django,主表
From: https://www.cnblogs.com/shaoyishi/p/17350546.html

相关文章

  • Django4全栈进阶之路16 template模板的基础模板
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>{%blocktitle%}MySite{%endblock%}</title>{%blockstyles%}{%endblock%}</head><body><header><h1>MySite</h......
  • 加密Python项目代码之把Django或Flask项目打包成exe
    目录python代码仿泄露方案-方案一:启动起来,把源代码删除-方案二:pipinstaller打包成可执行文件-方案三:做到docker镜像中---》运行容器---》-epassword=授权码加密Python项目代码之把Django或Flask项目打包成exe:https://zhuanlan.zhihu.com/p/430490285......
  • Django4全栈进阶之路13 template模板
    在Django4中,模板是用于生成HTML响应的文件。模板将动态数据和静态HTML组合在一起,以便最终呈现给用户的页面。Django4中的模板使用Django模板语言(DjangoTemplateLanguage,简称DT)编写。DT与HTML类似,但包含一些特殊的标记和语法,用于动态地生成HTML内容。以下是一......
  • Django4全栈进阶之路11 view视图
    在Django4中,视图(View)是一个处理请求并返回响应的Python函数或类的组合。视图函数通常是处理请求的主要逻辑,因此它是DjangoWeb应用程序的重要组成部分。视图函数的基本结构如下:fromdjango.httpimportHttpResponsedefmy_view(request):#处理请求的代码r......
  • Django4全栈进阶之路9 url路由设置
    在Django4中,可以在主路由文件中设置和管理子路由。通常,我们会为每个应用程序创建一个子路由文件,以便更好地组织代码和管理路由。以下是Django4中设置主路由和子路由的示例:首先,在主路由文件urls.py中导入子路由,并将其添加到urlpatterns中:#urls.pyfromdjango.urls......
  • Django4全栈进阶之路8 STATIC静态文件路径设置、MEDIA媒体文件路径设置
     在Django4中,可以在settings.py文件中设置STATICFILES_DIRS来指定应用程序静态文件所在的文件夹路径,设置STATIC_ROOT来指定收集所有应用程序静态文件的目标文件夹路径。例如:#settings.pySTATICFILES_DIRS=[os.path.join(BASE_DIR,'static'),]STATIC_ROO......
  • Django4全栈进阶之路7 createsuperuser创建超级管理员账号
    在Django4中,可以使用createsuperuser命令来创建超级管理员账号。超级管理员拥有管理后台的所有权限,包括创建、编辑和删除用户、组、权限等操作。下面是创建超级管理员账号的步骤: 1、执行以下命令创建超级管理员账号: pythonmanage.pycreatesuperuser2、设置用户信......
  • Django(二)
    Django(二)配置文件的介绍SECRET_KEY='django-insecure-l90y*hw_4v_&tgpwi$js+7)899ltdn=$=3$c!yct!f*mc6u#0j'#盐DEBUG=True#不想显示错误就改成False,上线的时候在改成False#配置数据库DATABASES={'default':{'ENGINE':'djang......
  • Django(三)
    Django(三)ORM的增删改查模板变量的分配"""第一种方式"""defab_render(request):#模板语法,写在views中user_dict={'username':'lisi','password':123}returnrender(request,'ab_render.html',{'......
  • mysql主从:mysql 主从、django使用多数据库做读写分离
    目录一、mysql主从介绍搭建步骤二、django使用多数据库做读写分离一、mysql主从介绍MySQL主从复制是一种常见的数据库复制技术,可以将一个MySQL数据库的数据复制到多个从库中,从而提高读取性能和数据可用性。在主从复制中,主库是数据的源头,从库是数据的副本,主库将数据变更记录......