Django model反向关联名称的方法
作者:GrandG7 时间:2021-03-06 17:21:28
如果你在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反向名称。但在抽象基类上这样做就会引发一个很严重的问题。因为 Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括related_name)。
当你在(且仅在)抽象基类中使用 related_name 时,如果想绕过这个问题,名称中就要包含'%(app_label)s'和 ‘%(class)s'。
‘%(class)s'会替换为子类的小写加下划线格式的名称,字段在子类中使用。
‘%(app_label)s'会替换为应用的小写加下划线格式的名称,应用包含子类。每个安装的应用名称都应该是唯一的,而且应用里每个模型类的名称也应该是唯一的,所以产生的名称应该彼此不同。
from django.db import models
class Base(models.Model):
m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related")
class Meta:
abstract = True
class ChildA(Base):
pass
class ChildB(Base):
pass
ChildA.m2m 字段的反向名称是 common_childa_related,而 ChildB.m2m 字段的反向名称是 rare_childb_related。这取决于你如何使用 ‘%(class)s' 和'%(app_label)s来构造你的反向名称。如果你没有这样做,Django 就会在验证 model (或运行 migrate) 时抛出错误。
如果你没有在抽象基类中为某个关联字段定义 related_name 属性,那么默认的反向名称就是子类名称加上'_set',它能否正常工作取决于你是否在子类中定义了同名字段。例如,在上面的代码中,如果去掉 related_name属性,在 ChildA中,m2m 字段的反向名称就是 childa_set;而 ChildB的 m2m 字段的反向名称就是 childb_set。
来源:https://blog.csdn.net/GrandG7/article/details/79020279
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SQL Server数据库连接中常见的错误分析
Python面向对象之反射/自省机制实例分析
oracle命令行删除与创建用户
Python使用微信接入图灵机器人过程解析
![](https://img.aspxhome.com/file/2023/1/64711_0s.jpg)
OverFlow – 一个秘密武器
![](https://img.aspxhome.com/file/UploadPic/20109/25/rss1-42s.png)
ASP用户登录模块的设计源码
数据安全之MySQL安全的二十三条军规
PHP之深入学习Yii2缓存Cache组件详细讲解
![](https://img.aspxhome.com/file/2023/1/55561_0s.jpg)
JavaScript的目的及历史
段正淳的css笔记(5)未知图片垂直居中的方法
python 爬虫百度地图的信息界面的实现方法
![](https://img.aspxhome.com/file/2023/9/65419_0s.png)
显示ASP页面源码的代码
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Python基于回溯法子集树模板解决野人与传教士问题示例
![](https://img.aspxhome.com/file/2023/8/60948_0s.jpg)