iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系。...对象一开始初始化的时候其属性为nil,给属性赋值其实就是让属性指向一块存储内容的内存,使这个对象的属性跟这块内存产生一种关联。 那么如果想动态的添加属性,其实就是动态的产生某种关联就好了。...方法三:使用RunTime关联对象动态添加属性 RunTime提供了动态添加属性和获得属性的方法 static const char Myheight; -(void)setHeight:(int)...); 参数一:id object : 给哪个对象添加属性,这里要给自己添加属性,用self。...object : 获取哪个对象里面的关联的属性。
models.CASCADE:删除关联数据,与之关联也删除 models.DO_NOTHING:删除关联数据,引发错误IntegrityError models.PROTECT:删除关联数据,引发错误ProtectedError...与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) def func(): return 10 class MyModel(models.Model): user = models.ForeignKey...("self") 此时,person对象就没有person_set属性。...self", symmetrical=False) 此时,person对象现在就可以使用person_set属性进行反向查询。...through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
如果没有给定自述名,Django 将根据字段的属性名称自动创建自述名–就是将属性名称的空格替换成下划线。...通常来说,如果启用了 Django 管理后台,你就可以在后台将 ManyToManyField 实例添加到关联对象中。...然而如果将它做为其他 model 的基类,那么该类的字段就会被添加到子类中。抽象基类和子类如果含有同名字段,就会导致错误(Django 将抛出异常)。...因为 Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括 related_name)。注:这样每个子类的关联字段都会指向同一个字段。...如果你没有这样做,Django 就会在验证 model (或运行 syncdb) 时抛出错误。
如果没有给定自述名,Django 将根据字段的属性名称自动创建自述名 —— 将属性名称的下划线替换成空格。...用法和其他字段类型一样:在模型里面做为类属性包含进来。 当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系。 OneToOneField要一个位置参数:与模型关联的类。...如果你没有这样做,Django 就会在验证 model (或运行 migrate) 时抛出错误。...像下面那样,向customers字段中添加related_name可以解决这个错误:models.ManyToManyField(Place, related_name='provider')。...查询集始终返回请求的模型 也就是说,没有办法让DJango在查询Person对象时返回MyPerson对象。Person 对象的查询集会返回相同类型的对象。
OneToOneField与ForeignKey加上unique=True效果基本一样,但是用OneToOneField反向关联会直接返回对象。...Car.objects.get(name='Audi') e = Engine.objects.get(name='Diesel') e.car # OneToOneField的反向关联属性如果没有写...objects.get(name='Mazda') e2 = Engine2.objects.get(name='Wankel') e2.car2_set.all() # OneToOneField的反向关联属性如果没有写...若数据库提高了引用完整性,则此种设置会抛出一个IntegrityError,除非对这一数据字段手动添加了SQL语句中的ON DELETE字段 还可以通过设置abstract属性来定义一个抽象类: from...ManyToManyField类有两个经常使用的参数:through和through_fields,通过这两个参数可以十分方便地建立中间项的关联,如示例代码所示: from django.db import
如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。...models.CASCADE 删除关联数据,与之关联也删除 models.DO_NOTHING 删除关联数据,引发错误IntegrityError models.PROTECT 删除关联数据,引发错误ProtectedError...("self") 此时,person对象就没有person_set属性。...("self", symmetrical=False) 此时,person对象现在就可以使用person_set属性进行反向查询。...through 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
", 'invalid': '格式错误'} validators 自定义错误验证(列表类型),从而定制想要的验证规则 from django.core.validators...on_delete 级联删除选项 ManyToManyField 用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。...("self") 此时,person 对象没有 person_set属性。...("self", symmetrical=False) 此时,person 对象可以使用 person_set 属性进行反向查询。...through 在使用 ManyToManyField 字段时,Django 将自动生成一张表来管理多对多的关联关系。
default_related_name Options.default_related_name Django 1.8中新增: 这个名字会默认被用于一个关联对象到当前对象的关系。默认为 _set。...order_with_respect_to Options.order_with_respect_to 按照给定的字段把这个对象标记为”可排序的“。这一属性通常用到关联对象上面,使它在父对象中有序。...你向ordering属性添加的每个字段都会产生你数据库的开销。你添加的每个外键也会隐式包含它的默认顺序。...如果你需要验证ManyToManyField关联的唯一性,试着使用信号或者显式的贯穿模型(explicit through model)。...该对象复数形式的名称: verbose_name_plural = "stories" 如果此项没有设置,Django 会使用 verbose_name + “s”。
如果你需要修改这一默认行为,创建中介表作为显式的模型(设置为managed),并且使用ManyToManyField.through为你的自定义模型创建关联。...order_with_respect_to 这个选项一般用于多对多的关系中,它指向一个关联对象,就是说关联对象找到这个对象后它是经过排序的。...指定这个属性后你会得到一个get_xxx_order()和set_xxx_order()的方法,通过它们你可以设置或者回去排序的对象 ordering 这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的...Django自动为每个设置了admin的对象创建添加,删除和修改的权限。...如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through属性。
models.CASCADE 删除关联数据,与之关联也删除 models.DO_NOTHING 删除关联数据,引发错误IntegrityError models.PROTECT 删除关联数据,引发错误...ManyToManyField 用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。...("self") #本身多对多关联 此时,person对象就没有person_set属性。...through: 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。...permissions permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。 要创建一个对象所需要的额外的权限.
默认地,Django 使用关联对象的主键。...ForeignKey.related_name 这个名称用于让关联的对象反查到源对象. 如果你不想让Django 创建一个反向关联,请设置related_name 为 '+' 或者以'+' 结尾....ManyToManyField.through Django 会自动创建一个表来管理多对多关系, 若要手动指定关联表则需要使用through关键字参数....添加删除关联 因为ManyToManyField自动维护关联表,程序员不便于直接访问.ManyToManyField提供了API用于添加和删除关联(即through表中的记录)....flight.reserve.remove(user) flight.save() 参考资料: django文档-模型字段-关联字段 django文档 - 执行查询 - 关联的对象 django文档 -
", 'invalid': '格式错误'} validators 自定义错误验证(列表类型),从而定制想要的验证规则 from django.core.validators import...,删除关联数据,引发错误ProtectedError - models.SET_NULL,删除关联数据,与之关联的值设置为...,get返回的是一个model对象,其没有update方法....annotate()的每个参数都是一个annotation,它将添加到返回的QuerySet每个对象中。 ...每个字典表示一个对象,键对应于模型对象的属性名称。
get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。...).first() ## 必须添加一个可迭代对象 book.authors.set([2,]) book.authors.set([zls,]) ## 错误写法...("self") 此时,person对象就没有person_set属性。...("self", symmetrical=False) 此时,person对象现在就可以使用person_set属性进行反向查询。...through 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。而可用的选项大致包含以下几类 abstract 这个属性是定义当前的模型是不是一个抽象类。...默认值为True,如果你不希望这么做,可以把manage的值设置为False order_with_respect_to 这个选项一般用于多对多的关系中,它指向一个关联对象,就是说关联对象找到这个对象后它是经过排序的...指定这个属性后你会得到一个get_xxx_order()和set_xxx_order()的方法,通过它们你可以设置或者回去排序的对象 ordering 这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的...Django自动为每个设置了admin的对象创建添加,删除和修改的权限。...如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through属性。
查 基于对象,正向找属性,反向找类名小写,多条记录类名小写_set book.publish.first().name (book 一定是对象,不是queryset) publish.book_set.first...OneToOneField(): 一对一字段 同外键 3, ManyToManyField() :多对多关系 to = 关联模型类 through=关联关系类 through_fields关联关系表中...(本身字段,关联字段) 断开外键关联的ForeignKey使用(一对多,一对一) # 一对多查询 —-(publish and book) # 方式一 : 不使用外键,在book 中添加 publish_id...— 多对多自动创建关系表 # 断开关联(db_constraint属性)的多对多自动创建关系表 (book(外键) and author) # 断开后依然支持Django ORMlianiao 查询语法...): name = models.CharField(max_length=20) # 明确through与through_fields,ManyToManyField才不会自动建立关系表,没有关联关系后就不能再使用
CommonInfo 模型不能用作普通的 Django 模型,因为它是一个抽象基类。它不会生成数据表,也没有管理器,也不能被实例化和保存。...然而,使用的名字是 ForeignKey 和 ManyToManyField 关系的默认值。如果你在继承父类模型的子类中添加了这些关联,你 必须 指定 related_name 属性。...假如你忘了,Django 会抛出一个合法性错误。...你需要告诉 Django 这是一个代理模型,通过将 Meta 类的 proxy 属性设置为 True。 例如,假设你想为 Person 模型添加一个方法。...代理模型继承“Meta”属性 和普通模型一样。 QuerySet 仍会返回请求的模型¶ 当你用 Person 对象查询时,Django 永远不会返回 MyPerson 对象。
将会在你添加错误类型的对象时抛出异常。...与 entry 相关联,Django 会认为它没有 name 属性,而不会因为不存在 author 抛出异常。...以最上面的 models 为例,一个 Entry 对象 e 能通过 blog 属性获得相关联的 Blog 对象: e.blog。...将某个特定的 model 对象添加到被关联对象集合中。 create(**kwargs) 创建并保存一个新对象,然后将这个对象加被关联对象的集合中,然后返回这个新对象。...唯一的差虽就在于属性的命名: ManyToManyField 所在的 model (为了方便,我称之为源model A) 使用字段本身的名称来访问关联对象;而被关联的另一方则使用 A 的小写名称加上 ‘
---- ManyToManyField 用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。...models.CASCADE 删除关联数据,与之关联也删除 models.DO_NOTHING 删除关联数据,引发错误IntegrityError models.PROTECT 删除关联数据,引发错误ProtectedError...) models.SET 删除关联数据, 与之关联的值设置为指定值,设置:models.SET(值) 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) ---- db_constraint...---- through 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。...只有设置了该属性,我们查询到的结果才可以被reverse()。
(to="Book", related_name="authors") #自动生成的第三张表我们是没有办法添加其他字段的 方式三:设置ManyTomanyField 并指定自行创建的第三张表(称为中介模型...through 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。...models.CASCADE 删除关联数据,与之关联也删除 models.DO_NOTHING 删除关联数据,引发错误IntegrityError models.PROTECT 删除关联数据,引发错误...中添加纪录,给书添加两个作者,下面的语法就是告诉orm给第三张表添加两条数据 book_obj.authors.add(yuan,egon) # 将某些特定的 model 对象添加到被关联对象集合中...,这个对象里面包含着max_price这个属性,后面写values方法是获取的这些对象的属性的值,当然,可以加双下划线来连表获取其他关联表的数据,但是获取的其他关联表数据是你的这些model对象对应的数据
#添加一指定的模型对象到关联的对象集中。 create(**kwargs) #创建一个新的对象,将它保存并放在关联的对象集中。返回新创建的对 象。 remove(obj1, obj2, ...)...#从关联的对象集中删除指定的模型对象。...clear() #从关联的对象集中删除所有的对象 多对多 要实现多对多,就要使用django.db.models.ManyToManyField类,和ForeignKey一样,它也有一个位置参数,用来指定和它关联的...(Group) 建议以被关联模型名称的复数形式做为 ManyToManyField 的名字 在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可——不要在两个模型中都设置...当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系
领取专属 10元无门槛券
手把手带您无忧上云