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反向关联名称的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
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
随机推荐
- 关于sql脚本导入Oracle时重复生成check约束的问题解决
- 解析c#操作excel后关闭excel.exe的方法
- Swift中的访问控制和protected
- 使用Ajax实时检测"用户名、邮箱等"是否已经存在
- 定时备份mysql, 定时切割nginx access log的方法
- Java线程调度之线程休眠用法分析
- CSS控制文本自动换行的问题
- 利用js获取服务器时间的两个简单方法
- 解决 JScript 中使用日期类型数据时出现类型错误的问题
- jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
- Java实现计算一个月有多少天和多少周
- 浅析JavaScript中的类型和对象
- 基于jquery的动画效果代码
- 一个仿DOS的Loading效果
- 利用JS hash制作单页Web应用的方法详解
- C# yield关键字详解
- PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
- 更改BootStrap popover的默认样式及popover简单用法
- 详解SqlServer 表达式(expression)
- Unity实现苹果手机Taptic震动