Django model反向关联名称的方法

 更新时间:2018年12月15日 15:40:11   作者:GrandG7  
今天小编就为大家分享一篇Django model反向关联名称的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

如果你在 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 更快进行探索性数据分析的四个方法

    Python 更快进行探索性数据分析的四个方法

    今天我给大家分享几种更快的探索性数据分析方法,它们可以进一步加速 EDA。 我们以一个学生考试成绩的例子,创建一个如下所示的 DataFrame 并继续操作。欢迎收藏学习,喜欢点赞支持
    2021-11-11
  • Python matplotlib绘制散点图的实例代码

    Python matplotlib绘制散点图的实例代码

    这篇文章主要给大家介绍了关于Python matplotlib绘制散点图的相关资料,所谓散点图就是反映两组变量每个数据点的值,并且从散点图可以看出它们之间的相关性,需要的朋友可以参考下
    2021-06-06
  • python3 shelve模块的详解

    python3 shelve模块的详解

    这篇文章主要介绍了python3 shelve模块的详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • python基础教程之类class定义使用方法

    python基础教程之类class定义使用方法

    Python中的类(Class)是一个抽象的概念,比函数还要抽象,这也就是Python的核心概念,面对对象的编程方法(OOP),其它如:Java、C++等都是面对对象的编程语言
    2014-02-02
  • Python实现的序列化和反序列化二叉树算法示例

    Python实现的序列化和反序列化二叉树算法示例

    这篇文章主要介绍了Python实现的序列化和反序列化二叉树算法,结合实例形式分析了Python二叉树的构造、遍历、序列化、反序列化等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Python模块 _winreg操作注册表

    Python模块 _winreg操作注册表

    通过python操作注册表主要有两种方式,一种是通过python的内置模块 _winreg,另一种方式就是 Win32 Extension For Python的win32api模块,这里主要简单看看用内置模块 _winreg如何操作注册表
    2020-02-02
  • 35个Python编程小技巧

    35个Python编程小技巧

    从我开始学习python的时候,我就开始自己总结一个python小技巧的集合。后来当我什么时候在Stack Overflow或者在某个开源软件里看到一段很酷代码的时候,我就很惊讶:原来还能这么做!,当时我会努力的自己尝试一下这段代码,直到我懂了它的整体思路以后,我就把这段代码加到我的集合里
    2014-04-04
  • python3实现UDP协议的服务器和客户端

    python3实现UDP协议的服务器和客户端

    这篇文章主要为大家详细介绍了python3实现UDP协议的服务器和客户端,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Python常见数据结构详解

    Python常见数据结构详解

    这篇文章主要介绍了Python常见数据结构,需要的朋友可以参考下
    2014-07-07
  • 详解Python中的null是什么

    详解Python中的null是什么

    这篇文章主要介绍了Python中的null是什么,Python中其实没有null这个词,取而代之的是None对象,即特殊类型NoneType,代表空、没有,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论