related_name和related_query_name属性

这篇具有很好参考价值的文章主要介绍了related_name和related_query_name属性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Django模型继承中,假如在外键或多对多字段中使用了related_name属性或related_query_name属性,则必须为该字段提供一个独一无二的反向名字和查询名字。但是,这样在抽象基类中一般会引发问题,因为基类中的字段都被子类继承并且保持了同样的值,这其中当然也包括related_name属性和related_query_name属性。

为了解决上述问题,当在抽象基类中(也只能是在抽象基类中)使用related_name属性和related_query_name属性时,部分值需要包含“%(app_label)s”和“%(class)s”,具体说明如下:

  • %(class)s:用该字段子类的小写类名替换。
  • %(app_label)s:用小写的、包含子类的应用名替换。每个安装的应用名必须唯一,应用内的每个模型类名也必须唯一,因此替换后的名字也是唯一的。

关于related_name属性或related_query_name属性的使用,示例代码如下:

【代码3-19】

01  # --- common app --- #
02  # common/models.py:
03  
04  from django.db import models
05  
06  class Base(models.Model):
07      m2m = models.ManyToManyField(
08          OtherModel,
09          related_name="%(app_label)s_%(class)s_related",
10          related_query_name="%(app_label)s_%(class)ss",
11      )
12  
13      class Meta:
14          abstract = True
15  
16  class ChildA(Base):
17      pass
18  
19  class ChildB(Base):
20      pass
21  
22  # --- another app --- #
23  # another/models.py:
24  
25  from common.models import Base
26  
27  class ChildB(Base):
28      pass

【代码分析】

在第01~20行代码中,定义了第一个Python应用common app,具体内容说明如下:

  • 在第06~14行代码中,定义了一个抽象基类Base:
  1. 在第07~11行代码中,定义了一个多对多属性m2m,并使用了related_name属性和related_query_name属性。
  2. 在第13、14行代码中,在Meta类中添加了属性“abstract=True”,表明Base类为抽象     基类。
  • 在第16、17行和第19、20行代码中,定义了两个继承自抽象基类Base的子类ChildA和ChildB,具体内容说明如下:
  1. common.ChildA.m2m字段的反转名是common_childa_related,反转查询名是common_childas。
  2. common.ChildB.m2m字段的反转名是common_childb_related,反转查询名是common_childbs。

在第22~28行代码中,定义了第二个Python应用another app,具体内容说明如下:

  • 在第27、28行代码中,定义了一个继承自抽象基类Base的子类ChildB。其中,another.ChildB.m2m字段的反转名是another_childb_related,反转查询名是another_childbs。

如何使用“%(class)s”和“%(app_label)s”构建关联名字和关联查询名,取决于设计人员。不过,如果在设计时忘了使用“%(class)s”和“%(app_label)s”,那么Django会在执行系统检查或运行迁移时抛出错误。如果设计时未指定抽象基类中的related_name属性,那么默认的反转名会是子类名后接“_set”。

本文节选自《Django 5企业级Web应用开发实战(视频教学版)》,获出版社和作者授权发布。

related_name和related_query_name属性,Django 5框架Web应用开发,数据库文章来源地址https://www.toymoban.com/news/detail-861608.html

到了这里,关于related_name和related_query_name属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 跟进 .NET 8 Blazor 之 ReuseTabs 支持 Query 属性绑定

    ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限性,也跟原来的 MVC,Razor Pages 框架在底层完成了统一。 AntDesign Blazor 作为 Blazor 最受欢迎的开源组件库之一,

    2024年02月15日
    浏览(40)
  • 解决match/range [match] malformed query, expected [END_OBJECT] but found [FIELD_NAME]

    使用es查询数据的时候会遇到提示match/range [match] malformed query, expected [END_OBJECT] but found [FIELD_NAME]错误,这个时候你需要检查一下自己的query条件的大括号,这类问题基本是 花括号的位置不正确引起的 ,例如 是正确的,如果是这样就会报上述错误, 下面是错误示范 大家看出区

    2024年02月12日
    浏览(44)
  • HTML 元素中的name 属性

    name 属性是 HTML 元素中常用的属性之一。它用于指定表单元素的名称,以便在提交表单时将其值与对应的键关联起来。 每个表单元素(例如 input 、 select 和 textarea )都可以具有一个 name 属性,该属性为元素提供一个唯一的标识符。当用户在提交表单时,浏览器会将表单元素的

    2024年02月13日
    浏览(41)
  • ModuleNotFoundError: No module named ‘django‘

    问题描述: 在pycharm中启动Django项目时,显示ModuleNotFoundError: No module named \\\'django\\\' , 但是在setting中检查存在django     解决办法: (1)  首先检查Django和python版本是否匹配       (2)  由于我使用的是conda环境,因此需要激活,可通过Anaconda prompt进行激活,或者在pycharm中激活,参考

    2024年02月12日
    浏览(45)
  • meta标签name=“referrer“属性的写法和用法

    HTMLmeta标签name=\\\"referrer\\\"属性主要用于控制网页发送给服务器的referrer信息,可以告诉服务器端用户是从哪个页面来到当前网页的。 什么是referrer? referrer有“引用页面”或“来源页面”的意思,用来指定当前页面是从哪个页面跳转过来的,也就是说HTTP请求报头中的referrer包含了

    2024年02月10日
    浏览(37)
  • 常见的 HTML<meta> 标签的 name 属性及其作用

    HTML中的 meta 标签可以通过 name 属性提供元数据,这些元数据可以用于指定有关文档的信息,以及控制浏览器和搜索引擎的行为。 name 属性通常与其他属性一起使用,如 content 、 charset 、 http-equiv 等,以提供更具体的元数据信息。 以下是一些常见的 meta 标签的 name 属性及其作

    2024年02月11日
    浏览(43)
  • vue前端开发自学,插槽练习第二次,name属性的使用

    vue前端开发自学,插槽练习第二次,name属性的使用!可以使用name属性,来自定义一个名字,这样,就可以在一个组件内同时出现多个插槽的内容了。在子组件内接收的时候,很简答,只需要在slot标签里面加上name=“mz”; 下面看代码。 这个内容是app.vue入口文件的内容源码。下面

    2024年02月02日
    浏览(57)
  • element中表格组件的row-class-name和class-name属性的使用以及无效处理

    1.这两个属性的使用,row-class-name用在el-table标签上,class-name用在el-table-column标签上。两个属性即可绑定类名也可绑定函数 2.绑定函数时就可以通过条件来决定哪行需要添加样式 3.样式无效处理 样式没有效果的原因在于添加的样式不是全局样式,所以只需要将scoped去除或者自

    2024年01月20日
    浏览(54)
  • 编写一个Student类,包含name和age属性,提供有参构造方法

    2. 请按照下列要求编写程序。 ( 1 ) 编写一个 Student 类,包含 name 和 age 属性,提供有参构造方法。 ( 2 ) 在 Student 类中,重写 toString() 方法,输出 age 和 name 的值。 ( 3 ) 在 Student 类中,重写 hashCode() 和 equals() 方法 hashCode() 的返回值是 name 的 hash 值与 age 的和。 equals(

    2024年02月11日
    浏览(37)
  • Django模型的属性与方法

    本节介绍Django模型的属性和方法,以及如何重写之前定义的模型方法等内容。 3.5.1  模型属性 Django模型中最重要的属性就是Manager,它是Django模型和数据库查询操作之间的接口,并且被用作从数据库当中获取实例的途径。如果Django模型中没有指定自定义的Manager,则默认名称就

    2024年04月26日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包