Django model反向关联名称的方法

yipeiwu_com6年前Python基础

如果你在 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。

以上这篇Django model反向关联名称的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Pycharm学习教程(3) 代码运行调试

Pycharm学习教程(3) 代码运行调试

Pycharm代码运行调试,具体内容如下 1、准备工作   (1)Python版本为2.7或者更高版本   (2)已经创建了一个Python工程并且添加了内容,具体参考: Getting...

Python实现Linux中的du命令

Python实现Linux中的du命令

实现代码如下: 说明:现在代码已实现du命令的 -s 统计功能,统计与系统du命令稍有差别,比如用ls -ld /root结果为4096,而du计算出来是1040,用当前python计算...

Python 比较两个数组的元素的异同方法

通过set()获取两个数组的交/并/差集: print set(a).intersection(set(b)) # 交集 print set(a).union(set(b)) # 并...

Python编程深度学习绘图库之matplotlib

Python编程深度学习绘图库之matplotlib

matplotlib是python的一个开源的2D绘图库,它的原作者是John D. Hunter,因为在设计上借鉴了matlab,所以成为matplotlib。和Pillow一样是被广...

详解Python的数据库操作(pymysql)

使用原生SQL语句进行对数据库操作,可完成数据库表的建立和删除,及数据表内容的增删改查操作等。其可操作性很强,如可以直接使用“show databases”、“show tables”等...