django自定义管理器和model的继承文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
在我写代码时建立的很多数据库需要一些共同的字段,比如is_active, create_time这些字段,所以可以建立一个基类model文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
模型的继承文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
我们可以充分利用oop特性,建立一个基类model,以后所有的model都继承这个类, 就不用在每个类都额外添加字段文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class BaseModel(models.Model): is_active = models.BooleanField(default = True ) create_time = models.DateTimeField() class Meta: ''' 指定这个类是一个抽象模型类, 这个模型就不会被生成表 ''' abstract = True class ChildModel(BaseModel): name = models.CharField(max_length = 10 ) age = models.PositiveIntegerField() class Meta: ''' meta属性可以重写, 不重写的话也会继承基类meta ''' verbose_name = '子模型' |
重写Django的model.objects文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
当我们使用model.objects.filter()时,经常会过滤掉is_active=False的,但是这样我们每个 filter(is_active=True)都需要这样写,那我们能不能重写掉这个filter方法, 让他每次可以自己过滤掉,这里我们可以看一下django的源码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 这里源码我就不拉出来了, 我们可以看到django是set了个objects属性, 这个属性对应是一个类的实例对象 class Manager(BaseManager.from_queryset(QuerySet)): ''' objects 是这个类的实例对象, 这个类我们可以看到他其实继承了 QuerySet类里的方法, 所以我们可以直接重写个这个类方法,并重写filter方法 ''' def filter ( self , * args, * * kwargs): """ 我们可以看到 QuerySet里的filter方法和exclude方法都是调用了这个方法, 这个方法的内部实现可 以自己看一看,就是用的kwargs里的参数 """ return self ._filter_or_exclude( False , * args, * * kwargs) class MyManager(models.Manager): def filter ( self , * args, * * kwargs): ''' 源代码的filter函数是有返回值的,所以我们将super出来的结果返回出去,我们只需要在kwargs中增加个参数就行 ''' if not kwargs.get( 'is_active' , True ): # 如果需要查看所有数据, kwargs[ 'is_active' ] = False return super (AddressManager, self ). filter ( * args, * * kwargs) # 最后我们在我们的ChildModel下将objects对象赋值为MyManager的实例对象就可以使用了 # 我们可以将这个objects写在基类里面,这样所有的model就可以都会有这个方法,具体怎么使用视情况而定 class ChildModel(models.Model): objects = MyManager() |
模型类也是可以多继承的,如果有特殊的用法可以具体百度或Google一下, 这里只是个简单的引入面向对象的概念,我们很多地方可以用继承框架已有的类并重写类中的方法,是我们的代码更加pythonic文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
补充知识:Django中的Model中的字段属性和选项文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
字段类型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
autoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
CharField(max_length=字符长度):字符串,默认的表彰样式是TextInput文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
TextField:大文本字段,一般超过4000时使用,默认的表单控件是Textarea文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
IntegerField:整数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
DecimalField(max_digits=None, decimal_places=None): 使用Python的Decimal实例表示的十进制浮点数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
参数说明: DecimalField.max_digits----位数总数
DecimalField.decimal_places---小数点后的数字位置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
FloatField: 使用Python的float实例来表示的浮点数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
BooleanField:True/False 字段,此字段的默认表彰控制是CheckboxInput文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
NullBooleanField:支持 Null, True, False 三种值文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
DateField([auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
参数说明:
DateField.auto_now
每次保存对象时,自动设置该字段为当前时间,用于“最后一次修改”
的时间戳,它总是使用当前日期,默认为 False文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
DateField.auto_now_add文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
当前对象第一次被创建时自动设置当前时间,用于创建的时间戳,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
它总是使用当前日期,默认为 False文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
说明
该字段默认对应的表单控件是一个TextInput.在管理员站点添加了一个
JavaScript写的日历控件,和一个“Today”的快捷按钮,包含了一个额外
的invalid_date错误消息键
注意
auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间
的任何组合将会发生错误的结果文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
TimeField: 使用Python的datetime.time实例表示的时间,参数同DateField文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
DateTimeField: 使用Python的datetime, datetime实例表示的日期和时间,参数同DateField文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
FileField: 一个上传文件的字段文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是一个有效的image文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
字段选项文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
概述:通过字段选项,可以实现对字段的约束, 在字段对象中通过关键字参数指定文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
null:如果为True,Django将空值以NULL存储在数据库中,默认值为False文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
blanke:如果为True,则该字段允许为空白,默认值为False文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
注意: null是数据库范畴的概念,blank是表彰验证范畴的概念文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
db_column:字段的名称,如果未指定,则使用属性的名称文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
db_index:若值为 True,则在表中会为此字段创建索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
default: 默认值文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
primary_key: 若为 True,则该字段会成为模型的主键字段文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
unique:如果为 True,这个字段在表中必须有唯一值文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
注意:在生成迁移文件之后如果修改的参数不影响表结构,则不用重新生成迁移文件。(default,blank 不影响表的结构。不用重新生成迁移文件)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
关系类型文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
分类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
ForeignKey:一对多,将字段定义在多的端中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
ManyToManyField:多对多,将字段定义在两端中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
OneToOneField:一对一,将字段定义在任意一端中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
(1)用一访问多:格式: 对象.模型类小写_set文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
示例: grade.students_set文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
(2)用一访问一:格式:对象.模型类小写文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
示例: grade.studnets文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
(3)访问id:格式:对象.属性_id文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html
例子:btitle = models.CharField(max_length=20,db_column=‘title',unique=‘true')文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/30499.html