related_name和related_query_name属性

server/2024/9/23 10:16:38/

在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应用开发实战(视频教学版)》,获出版社和作者授权发布。


http://www.ppmy.cn/server/19306.html

相关文章

Django框架模板位置(默认自定义)

1、默认模板位置 如果当前项目名称为learning_log 在该项目下,有一个应用,名称为learning_logs 那么Django默认的‘模板位置’是: .\learning_log\learning_logs\templates\learning_logs 2、自定义模板位置 修改项目learning_log的sett…

BUUCTF——[RoarCTF 2019]Easy Java

BUUCTF——[RoarCTF 2019]Easy Java 1.既然是登录框嘛,不得随便输入个弱口令,进行尝试 2.使用弱口令爆破了一下,直接就是429,无果 3.查看版本信息 4.帮助文档这里测试啦任意文件读取,无果 5.知道服务器的名称是openresty 6.…

汽车企业安全上网解决方案

需求背景 成立于1866年的某老牌汽车服务独立运营商,目前已经是全球最大的独立汽车服务网络之一,拥有95年的历史,在全球150多个国家拥有17,000多个维修站,始终致力于为每一位车主提供高品质,可信赖的的专业汽车保养和维…

SpringBoot教程(十九) | SpringBoot集成knife4j

首先介绍一下Knife4j. 就是一款接口文档框架,跟swagger类似。 但是整合了很多swagger的功能,页面比swagger美观。现在大有取代swagger之势 官方文档地址: https://doc.xiaominfo.com/docs/quick-start 其实主要的集成方式,在文档…

【智能算法】球形搜索算法(SSO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年,J Zhao等人受到超立方体搜索方式启发,提出了球形搜索算法(Spherical Search Optimizer, SSO)。 2.算法原理 2.1算法思想 SSO源于超立方体搜索…

【Jenkins】持续集成与交付 (六):Gitlab代码托管服务安装

【Jenkins】持续集成与交付 (六):Gitlab代码托管服务安装 一、Gitlab安装1.1 安装相关依赖1.2 启动SSH服务并设置为开机启动1.3 设置Postfix开机自启并启动1.4 开放SSH和HTTP服务,并重新加载防火墙列表1.5 下载GitLab包并安装1.6 修改GitLab配置1.7 重载配置及启动GitLab1.…

Linux怎么安装czmq(物联网消息通讯轻量级消息队列)

首先打开yum源配置文件 ,加载czmq的官方源 [rootlocalhost package]# cd /etc/yum.repos.d/输入czmq的官方yum 源路径 [rootlocalhost yum.repos.d]# wget https://download.opensuse.org/repositories/network:messaging:zeromq:git-stable/CentOS_7/network:mes…

数据分析-pandas1

数据分析-pandas Pandas 是 Wes McKinney 在2008年开发的一个强大的分析结构化数据的工具集。Pandas 以 NumPy 为基础(实现数据存储和运算),提供了专门用于数据分析的类型、方法和函数,对数据分析和数据挖掘提供了很好的支持&…