参考:《Django文档》https://docs.djangoproject.com/zh-hans/2.1/topics/db/models/
1. 字段
字段类型:CharField、TextField、DateField、DateTimeField、IntegerField、BooleanField
字段参数:models.CharField("verbos_name", null=ture, blank=true, default="value_default", primary_key=true,)
2. 模型对象的基本操作
参考:https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/#lookups-that-span-relationships
在Django中,用一个Model类来表示数据库中的一张表,而用该类的实例对象来表示表中的某一条特定记录。
(1) 创建记录(create objects)
b=my_model(name=‘张三’) #创建
b.save() #保存
b=my_model.objects.create(name='张三') #创建&保存一步完成
b.name="李四" #改变参数值
b.save()
(2)获取对象(Retrieving objects)
为了获取数据库中对象,需要通过模型类对象(model class)的manager来创建一个QuerySet:
一个QuerySet代表了数据库的对象的集合,它有0个、1个或者许多个过滤器(Filter),Filter可以根据给定参数缩小查询结果的方法,QuerySet就相当与SELECT语句,而Filter就相当于限定子句WHERE或者LIMIT
每一个model class只有一个manager,那就是objects,通过它可以获得一个QuerySet,直接通过model class可以直接访问objects
- 获取多个对象: all/filter/exclude获得的是QuerySet
blogs=blog.objects.all() #获取模型blog中的所有的对象,或者说获取数据库中blog表中所有行(一行代表一个对象)
blogs=blog.objects.all().filter(**kwarg) # 筛选出满足给定参数的QuerySet
blogs=blog.objects.all().exclude(**kwarg) # 剃除掉出满足给定参数的QuerySet
#此时QuerySet并没有访问数据,只有当你另外下达指令,它才进行数据库的访问
- 获取单对象: get获得的是实例化的类对象(model class)
Limiting QuerySet
Entry.objects.all()[:5] #获取前5条记录
Entry.objects.all()[5:10] #获取第6-10条记录
Entry.objects.order_by('headline')[0] #获取第1条单条记录
(3) Field lookups : 就是提供给filter(), exclude(), get() 这些函数的参数格式
参考:https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/#field-lookups
一般格式: field__lookuptype=value(注意是双下划线)
Entry.objects.filter(pub_date__lte='2006-01-01') #pub_date是model class中定义的属性,lte代表<=
#相当与SQL语句: SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';
一个例外(外键约束的情况):fieldname_id=value(采用域名加上 “_id”的形式)
Entry.objects.filter(blog_id=4) #其中的blog是我们定义的model class
一些常见的lookuptype:
- exact: ( 如果提供的field lookups没有 lookuptype,则默认是这种)
Entry.objects.get(headline__exact="Cat bites dog") #相当于SQL语句:SELECT ... WHERE headline = 'Cat bites dog';
Blog.objects.get(id__exact=14) # 这两个效果是一样的
Blog.objects.get(id=14) # 没有looktype,则默认exact这种
iexact:不区分大小写
Blog.objects.get(name__iexact="beatles blog") #参数不区分大小写
contains:相当于SQL中的LIKE,是否包含子串,区分大小写
Entry.objects.get(headline__contains='Lennon')#相当于:SELECT ... WHERE headline LIKE '%Lennon%';
startswith/endwith (不区分大小写的版本:istartwith/iendwith)
Entry.objects.filter(headline__startswith='Lennon') #相当于:SELECT ... WHERE headline LIKE 'Lennon%';
3. pk
为了方便,Django用pk待代表一个表对象的主键primary key
blog = Blog.objects.filter(pk=1)
blog = Blog.object.filter(entry__pk=2) #访问关系中的pk