Django 关系字段 本文主要内容是关于Django框架中models的知识小结 #1 环境 Python3.7.3 Django==2.0.7 #2 字段 #2.1 一对多(ForeignKey)...与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) #2.4 数据库表示 在生成数据库时,Django追加"_id"字段名称来创建其数据库列名,可以通过指定显式更改此内容db_column...#2.5 反向查找 (related_name) from django.db import models class Blog(models.Model): name = models.CharField...Blog: haha> 反向查找 (Blog->Entry) 由被关联的表(Blog)->查->存放外键的表(Entry) >>> b = models.Blog.objects.get(id=1) >....RelatedManager object at 0x10d58c908> >>> b.entryblogs.all() # 一对多,所以反向获取到的数据是一个多条数据,需要all()
有一些限制条件是Django提供的,并没有数据库层面的对应物,比如blank。 (当blank参数为真时,对应字段可以为留为空白。) 在基本的模型设计上,Django ORM没有留什么坑。...需要注意的是,在Django ORM中,只能通过ForeignKey来定义多对一关系,不能显示地定义一对多关系。但你可以使用模型对象的*_set语法来反向调用多对一关系。...此外,多对多关系也可以用类似的方式反向调用,比如: group.customer_set 此外,你还可以在模型中加入related_name参数,从而在反省调用时,改用"*_set"之外的其他名称,比如...") 如果两个模型之间有多个关系时,related_name可以防止*_set重名。...看到一大串values()、annotate()变来变去,有没有觉得头晕?我觉得这种情况下,可以直接上原始的SQL查询语句了,没必要再自己折腾自己。
Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数。 ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True。...当 model 中如果没有自增列,则会自动创建一个列名为 id 的列。 IntegerField 一个整数类型,范围在-2147483648 to 2147483647。..., 文件夹路径 match = None, 正则匹配 recursive = False, 递归下面的文件夹 allow_files = True, 允许文件 allow_folders = False...to 设置要关联的表 to_field 设置要关联的表的字段 related_name 反向查询时,使用的字段名,用于代替原反向查询时的'表名_set'。...to 设置要关联的表 related_name 反向查询时,使用的字段名,用于代替原反向查询时的'表名_set'。 symmetrical 仅用于多对多自关联时,指定内部是否创建反向操作的字段。
当model中如果没有自增列,则自动会创建一个列名为id的列。...当model中如果没有自增列,则自动会创建一个列名为id的列。...(to_field='字段名') ---- related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。...(反向查询)时,我们会这么写: models.Classes.objects.first().student_set.all() 当我们在ForeignKey字段中添加了参数 related_name...OneToOneField参数 to 设置要关联的表。 ---- to_field 设置要关联的字段。
它包含几个重要的参数: path:必传参数。记录目录或者文件的绝对路径。例如:/home/monkey match:可选参数,它是一个正则表达式,主要用于匹配过滤出文件名。...4) related_name 用于关联对象反向引用模型的名称。主要用于反向查询,即外键源模型实例通过管理器返回第一个模型的所有实例。...用于从目标模型反向过滤模型对象的名称。...db_column: 指定当前数据库表中该字段的列名。如果没有指定,Django 默认将 Field 名作为字段名。 db_index: 如果赋值为 True, 将会为这个字段创建数据库索引。...如果用户没有定义该选项, Django会自动将自动创建,内容是该字段属性名中的下划线转换为空格的结果。
这个OneToOneField其实本质上就是一个外键,只不过这个外键有一个唯一约束(unique key),来实现一对一。 以后如果想要反向引用,那么是通过引用的模型的名字转换为小写的形式进行访问。...并且FrontUser对象可以使用userextension来访问对应的UserExtension对象。 如果不想使用Django默认的引用属性名字。...那么可以在OneToOneField中添加一个related_name参数。...实现方式:Django为这种多对多的实现提供了专门的Field。叫做ManyToManyField。还是拿文章和标签为例进行讲解。...在我们使用多对多反向引用添加的时候,只能使用add这种添加方式,比如向文章中添加标签,示例代码如下: article = Article.objects.first() tag = Tag(name="
CommonInfo 模型不能用作普通的 Django 模型,因为它是一个抽象基类。它不会生成数据表,也没有管理器,也不能被实例化和保存。...和 related_query_name 要格外小心 若你在 外键 或 多对多字段 使用了 related_name 或 related_query_name,你必须为该字段提供一个 独一无二 的反向名字和查询名字...class Meta: # Remove parent's ordering effect ordering = [] 继承与反向关系 由于多表继承使用隐式的 OneToOneField...指定父类连接字段 如上所述,Django 会自动创建一个 OneToOneField ,将子类连接回非抽象的父类。...一个代理模型可以继承任意数量的抽象模型类,假如他们 没有 定义任何的模型字段。一个代理模型也可以继承任意数量的代理模型,只需他们共享同一个非抽象父类。
小心使用 related_name 如果你在 ForeignKey 或 ManyToManyField 字段上使用 related_name 属性,你必须总是为该字段指定一个唯一的反向名称。...这取决于你如何使用 ‘%(class)s’ 来构造你的反向名称。如果你没有这样做,Django 就会在验证 model (或运行 syncdb) 时抛出错误。...如果你没有在抽象基类中为某个关联字段定义 related_name 属性,那么默认的反向名称就是子类名称加上 ‘_set’,它能否正常工作取决于你是否在子类中定义了同名字段。...例如,在上面的代码中,如果去掉 related_name 属性,在 ChildA 中,m2m 字段的反向名称就是 childa_set;而 ChildB 的 m2m 字段的反向名称就是 childb_set...但是这个 OnetoOneField 字段默认的 related_name 值与 django.db.models.fields.ForeignKey 和 django.db.models.fields.ManyToManyField
这些限制有变通的方法,因为没有要求字段名称必须与数据库的列名匹配。参 db_column 选项。...小心使用 related_name 如果你在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反向名称。...果你没有在抽象基类中为某个关联字段定义 related_name 属性,那么默认的反向名称就是子类名称加上'_set',它能否正常工作取决于你是否在子类中定义了同名字段。...例如,在上面的代码中,如果去掉 related_name属性,在 ChildA中,m2m 字段的反向名称就是 childa_set;而 ChildB的 m2m 字段的反向名称就是 childb_set。...但是这个 OnetoOneField 字段默认的 related_name 值与 ForeignKey 和 ManyToManyField 默认的反向名称相同。
当model中如果没有自增列,则自动会创建一个列名为id的列。 IntegerField 一个整数类型,范围在 -2147483648 to 2147483647。...字段参数 to 设置要关联的表 to_field 设置要关联的表的字段 related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。...(反向查询)时,我们会这么写: models.Classes.objects.first().student_set.all() 当我们在ForeignKey字段中添加了参数 related_name...反向查询操作时,使用的连接前缀,用于替换表名。...OneToOneField 一对一字段。 通常一对一字段用来扩展已有字段。 字段参数 to 设置要关联的表。 to_field 设置要关联的字段。 on_delete 同ForeignKey字段。
0904自我总结 django模型中有外键关系的表删除相关设置 一.一对一 例如有Author、AuthorDetail两表 author = models.OneToOneField(to='Author...', db_constraint=False, on_delete=models.DO_NOTHING, ) 1)关系字段放在Book表中(多的一方...):出版社删除书外键不动,书删除没有任何影响 2)出版社找书用 外键related_name(books),书找出版社 外键字段(publish) 3)db_constraint断开表关联,on_delete...models.DO_NOTHING为删除级联关系, models.CASCAD为级联关系,'SET_NULL'置空,SET_DEFAULT设为默认值 两者区别 models.SET关联表内容删了,关联的相关内容不会删除...:出版社删除或书删除彼此不影响,但关系表一定级联删除 2)正向找 外键字段,反向找 外键字段related_name 3)db_constraint断开表关联,on_delete不存在(不设置,本质在第三张表中设置
ORM概念: 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象( 1....c.related_name --> 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。 ...(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列...#反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。...ORM中的用法 OneToOneField(to="") 举例:作者和作者详情是一对一的;跟一对多,用法相同,只不过detail里面的不能重复;在数据库中也是多一个detail_id 字段 总结
Author 的查询频率高,如果字段太多会影响查询效率。...Author:多对多 authors = models.ManyToManyField(to='Author') Author - AuthorDetail:一对一 author = models.OneToOneField...class AuthorDetail(BaseModel): mobile = models.CharField(max_length=11) author = models.OneToOneField...='detail' # 正向查返回 name, 反向返回设置的 related_name ) class Meta: db_table = 'author_detail...级联操作 1.CASCADE 2.SET_NULL 3.SET_DEFAULT 4.DO_NOTHING 四、Admin 通过 Admin 我们可以直接通过后台来编辑表 admin.py注册 from django.contrib
与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) related_name=None # 反向操作时,使用的字段名,用于代替表名_set related_query_name...related_name=None # 反向操作时,使用的字段名,用于代替表名_set related_query_name=None # 反向操作时,使用的连接前缀...3.一对一 一对一其实就是 一对多 + 唯一索引,当两个类之间有继承关系时,默认会创建一个一对一字段,一对一使用OneToOneField来实现,如下: from django.db import models...(book) 它里面的参数如下: OneToOneField() to # 要进行关联的表名 to_field=None # 要关联的表中的字段名称...on_delete=None # 当删除关联表中的数据时,当前表与其关联的行的行为 五、管理员登陆 为了能让大家提前看到django的数据操作,django内置了一款非常到位的系统管理员登陆设计系统
关于Django Meta的详细讲解可以参考该博客。...更合理) """ Django orm中外键字段属性详解 在建表之前我们对外键字段属性进行了解: 1)related_name在外键中设置外键反向查询的字段名:正向找字段名,反向找related_name...值,related_name的默认值是表名小写 + _set,这就是为什么在Django中跨表反向查询时我们使用表名小写 + _set去查另一张表的数据。...将默认值设置为空,外键反向查询的字段名设置为book authors = models.ManyToManyField(to='Author', related_name='books...64) class AuthorDetail(BaseModel): mobile = models.CharField(max_length=64) author = models.OneToOneField
前言 前面在admin后台页面通过设置外键,可以选择下拉框的选项,本篇主要讲解关于外键(ForeignKey)的查询 models设计 在上一篇的基础上新增一个BankName表,Card表通过外键关联到...): return self.card_id class CardDetail(models.Model): '''银行卡详情信息''' card = models.OneToOneField...makemigrations 和migrate,同步数据 python manage.py makemigrations python manage.py migrate shell模式新增测试 为了调试方便,可以使用django...反向查询,当ForeignKey没设置related_name参数,默认是通过关联表的名称加_set去查询 查询结果是QuerySet集合对象 count()函数统计查询个数 [0].card_id 下标取值...当Card表的外键(ForeignKey)只有一个时,可以通过_set去查询到,当有多个外键时,就无法查询具体哪个外键了,这时候就需要加个related_name参数。
正确的模型命名和关系字段命名。 设置适当的related_name属性。 用OneToOneField代替ForeignKeyField(unique=True)。...模型定义参考 字段 对字段名称的限制 字段名不能是Python的保留字,否则会导致语法错误 字段名不能有多个连续下划线,否则影响ORM查询操作 Django模型字段类 字段类 说明 AutoField...related_name:用于获取关联对象的关联管理器对象(反向查询),如果不允许反向,该属性应该被设置为'+',或者以'+'结尾。 to_field:指定关联的字段,默认关联对象的主键字段。...on_delete:外键关联的对象被删除时对应的动作,可取的值包括django.db.models中定义的: CASCADE:级联删除。...ManyToManyField属性 symmetrical:是否建立对称的多对多关系。 through:指定维持多对多关系的中间表的Django模型。
为了能够扩展 django,必须对模型进行一些简单的更改。...OneToOneField 和 ManyToMany 字段就是这种情况。 对于这些情况,您需要:1. 找到约束 2. 进行迁移以删除它们 3....重新创建约束,包括 account_id 字段 要查找约束,请使用 psql 连接到您的数据库并运行 \d+ myapp_projectmanager 你将看到 ManyToMany (或 OneToOneField...tenant_id = 'account_id' objects = TenantManager() 3.2 处理外键约束 对于 ForeignKey 和 OneToOneField 约束,我们有几种不同的情况...最后你的模型应该是这样的: from django.db import models from django_multitenant.fields import TenantForeignKey from
领取专属 10元无门槛券
手把手带您无忧上云