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反向关联名称的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • django模型中的字段和model名显示为中文小技巧分享

    简单方法: models.py 复制代码 代码如下: class IceCreamBar(models.Model):     title = models.CharField(max_length=200,db_index=True,verbose_name="名称")         shell = models.CharField(max_length=100,verbose_name='外皮')         filling = models.CharField(max_le

  • Django中反向生成models.py的实例讲解

    命令行中进入Django项目目录,执行 python manage.py inspectdb testmodel_test 其中testmodel_test为数据表,生成的结果 from django.db import models class TestmodelTest(models.Model): name = models.CharField(max_length=20) c1 = models.CharField(max_length=255, blank=True, null=Tru

  • Django中url的反向查询的方法

    本文介绍了Django中url的反向查询的方法,分享给大家,具体如下: 明确几个概念: 1.application namespace : 正在部署的app的名称,一个app的多个实例应该具有相同的application namespace. 可以通过在URLconf模块(urls.py)中设置 app_name 属性(与urlpatterns属性同级)来指定application namesapce. (在django2.0版本中必须设置 app_name ) 2.instance names

  • django orm 通过related_name反向查询的方法

    如下所示: class level(models.Model): l_name = models.CharField(max_length=50,verbose_name="等级名称") def __str__(self): return self.l_name class userinfo(models.Model): u_name = models.CharField(max_length=50,verbose_name="用户名称") u_level = mo

  • Django使用详解:ORM 的反向查找(related_name)

    先定义两个模型,一个是A,一个是B,是一对多的类型. class A(models.Model): name= models.CharField('名称', max_length=32) class B(models.Model): a= models.ForeignKey(A, verbose_name='A类',related_name = "test") name = models.CharField('称呼', max_length=16) 如果我们要查询一个A拥有哪些B的话,

  • django如何连接已存在数据的数据库

    你有没有遇到过这种情况? 数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办??? Django是最适合所谓的green-field开发,即从头开始一个新的项目 但是呢,Django也支持和以前遗留的数据库和应用相结合的. Django的数据库层从Python代码生成SQL schemas.但是对于遗留的数据库,你已经用于SQL schemas,这种情况下你需要为你已经存在的数据库表写模型(为了使用数据库的API),幸运的是,Django自

  • Django model反向关联名称的方法

    如果你在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反向名称.但在抽象基类上这样做就会引发一个很严重的问题.因为 Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括related_name). 当你在(且仅在)抽象基类中使用 related_name 时,如果想绕过这个问题,名称中就要包含'%(app_label)s'和 '%(class)s'. '%(class)s

  • 浅谈django model的get和filter方法的区别(必看篇)

    django的get和filter方法是django model常用到的,搞清楚两者的区别非常重要. 为了说明它们两者的区别定义2个models class Student(models.Model): name = models.CharField('姓名', max_length=20, default='') age = models.CharField('年龄', max_length=20, default='') class Book(models.Model): student =

  • Django 多表关联 存储 使用方法详解 ManyToManyField save

    当models中使用ManyToManyField进行多表关联的时候,需要使用字段的add()方法来增加关联关系的一条记录,让两个实例关联起来才能顺利保存关联关系 #models.py 问题分类question_category和类别使用了多对多关系(先不管是否合理) #coding:utf-8 from django.db import models # Create your models here. class QuestionCategory(models.Model): categor

  • Django model序列化为json的方法示例

    本文环境 Python 3.6.5 Django 2.0.4 fix(2018.5.19):最近得知Django 的model基类需要声明为abstract,故在原来的代码加入abstract声明,以免误导 在Django中,关于如何将model类序列化为json,一般的话有两a器 将model类转为字典,再使用json库的dumps方法转为json 第一种方法就不多讲了,直接去看官方文档就好啦 一般来说,官方提供的方法应该都是比较好用和稳定的,然而,使用官方的序列化器却问题不少: 格式丑陋,格

  • Django 解决model 反向引用中的related_name问题

    问题: 定义表Apple: class Apple( models.Model): origin_level = models.ForeignKey(AppleLevel) new_level = models.ForeignKey(AppleLevel) 出现如下问题: monitor.apple: Accessor for field 'origin_level' clashes with related field 'AppleLevel.apple_set'. Add a related

  • Django框架model模型对象验证实现方法分析

    本文实例讲述了Django框架model模型对象验证实现方法.分享给大家供大家参考,具体如下: 模型对象的验证 验证一个模型涉及三个步骤: 验证模型的字段 -- Model.clean_fields() 验证模型的完整性 -- Model.clean() 验证模型的唯一性 -- Model.validate_unique() 当调用模型的full_clean() 方法时,这三个方法都将执行.当使用ModelForm时,is_valid() 将为表单中的所有字段执行这些验证.如果你计划自己处理验证

  • python实现根据ip地址反向查找主机名称的方法

    本文实例讲述了python实现根据ip地址反向查找主机名称的方法.分享给大家供大家参考.具体如下: import sys, socket try: result = socket.gethostbyaddr("66.249.71.15") print "Primary hostname:" print " " + result[0] # Display the list of available addresses #that is also r

  • Django model 中设置联合约束和联合索引的方法

    在Django model中对一张表的几个字段进行联合约束和联合索引,例如在购物车表中,登录的用户和商品两个字段在一起表示唯一记录. 举个栗子: Django model中购物车表 class Cart(models.Model): user = models.ForeignKey( MyUser, verbose_name="用户" ) goods = models.ForeignKey( Goods, verbose_name="商品" ) num = mode

  • Django 拆分model和view的实现方法

    在标准的dgango项目中,自动生成的目录结构会包括models.py和views.py两个文件,分别在里面写model的代码和controller的代码,但是所有的代码都写在一个文件里面在大项目中不好维护,因此需要拆分开来写. 看一下折腾的一个Django项目的代码目录配置: 1. 拆分model 新建一个model文件夹,在init.py里加上from preheat.model.order_model import * 这个其实就是引入你自己定义的model 引入包 2. 拆分views

  • Pycharm 操作Django Model的简单运用方法

    Django中的Models 是什么? 通常一个Model对应数据库的一张数据表, Django中Models以类似的形式表现, 它包含了一些基本字段以及数据的一些行为 在Django工程 app 模块中有models.py, 输入 from django.db import models # Create your models here. class Person(models.Model): name = models.CharField(max_length=30) age = mode

随机推荐