🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 数据库操作 首先编辑models.py ``` from django.db import models # Create your models here. class Person(models.Model): ID = models.AutoField(primary_key=True) name = models.CharField(max_length=30, null=False) age = models.IntegerField(null=True) # python2 使用 def __str__(self): return self.name # python3 使用 def __unicode__(self): return self.name ``` django 1.7以下 创建模型python manange.py syncdb ## 增加记录create ``` # 方法1 models.Person.objects.create(name=name,age=age) # 方法2 # 防止重复的最好方法 返回值(object, True/False) # 第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False # 重复与否的判断不包括自增列 Person.objects.get_or_create(name=name,age=age) # 方法3 p = models.Person(name=name,age=age) p.save() p = models.Person(name="TWZ") p.age = 23 p.save() # 方法4 dic = {}name: name, age: age} models.Person.objects.create(**dic) ``` >[info] **{}可以将字典转化为等号连接的键值对 ## 获取记录 all fliter get exclude ``` # 获取所有内容,返回值为记录的对象 models.Person.objects.all() # 切片操作,获取10个人,不支持负索引,切片可以节约内存 Person.objects.all()[:10] # 获取一条记录,未取到会报错,超过两条也会报错 Person.objects.get(name=name) # 获取多条记录 ## name严格等于 "abc" 的人 Person.objects.filter(name__exact="abc") Person.objects.filter(name="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC Person.objects.filter(name__iexact="abc") # 名称中包含 "abc"的人 Person.objects.filter(name__contains="abc") #名称中包含 "abc",且abc不区分大小写 Person.objects.filter(name__icontains="abc") # 正则表达式查询 Person.objects.filter(name__regex="^abc") # 正则表达式不区分大小写 Person.objects.filter(name__iregex="^abc") # 排除包含 WZ 的Person对象 Person.objects.exclude(name__contains="WZ") # 找出名称含有abc, 但是排除年龄是23岁的 Person.objects.filter(name__contains="abc").exclude(age=23) icontains(大小写无关的LIKE)contains startswith istartswith和endswith iendswith range in # 范围 gt lt gte lte # 比较操作 isnull # 允许为空 ``` ## 更新记录 #### 批量更新,适用于 .all() .filter() .exclude() 等后面 (危险操作,正式场合操作务必谨慎) ``` # 先获取实例,再进行更新 Person.objects.filter(name=name).update(name=newname) ``` #### 单个 object 更新,适合于 .get(), get_or_create(), update_or_create() 等得到的 obj,和新建很类似 ~~~ twz = Author.objects.get(name="WeizhongTu") twz.name="WeizhongTu" twz.email="tuweizhong@163.com" twz.save() ~~~ >[danger] get()取到的对象不能update,filter()可以 >[danger] 给数据库添加字段时,已有数据的新字段必须有默认值,有以下3中方法指定 1 在models.py定义字段时,指定default 2 在models.py定义字段时,指定null=True,允许数据库中的字段为空 3 在makemigrations提示时指定 ## 删除记录 delete ``` # 先获取实例,再进行更新 Person.objects.get(name=name).delete() ``` ## 排序 order_by >[danger] order_by()清除默认的排序 ``` #升序asc order_by("name") #降序desc order_by("-name") ``` ## 指定映射 value 用于获取单表指定的字段 ## 数量 ``` count() ``` ## 聚合 ``` from django.db.models import Min,Max,Sum Person.objects.all().aggregate(Max('id')) ``` ## 其他特性 ### QuerySet 是可迭代的,比如 ~~~ es = Entry.objects.all() for e in es: print(e.headline) ~~~ Entry.objects.all() 或者 es 就是 QuerySet 是查询所有的 Entry 条目。 >[danger] 如果只是检查 Entry 中是否有对象,应该用 Entry.objects.all().exists() >[danger] QuerySet 支持切片 Entry.objects.all()[:10] 取出10条,可以节省内存 >[danger] 用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*) >[danger] list(es) 可以强行将 QuerySet 变成 列表 ### QuerySet 支持链式查询 ~~~ Author.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com") Author.objects.filter(name__contains="Wei").exclude(email="tuweizhong@163.com") ~~~ 找出名称含有abc, 但是排除年龄是23岁的 ~~~ Person.objects.filter(name__contains="abc").exclude(age=23) ~~~ ### QuerySet 重复的问题,使用 .distinct() 去重 一般的情况下,QuerySet 中不会出来重复的,重复是很罕见的,但是当跨越多张表进行检索后,结果并到一起,可以会出来重复的值 ~~~ qs1 = Pathway.objects.filter(label__name='x') qs2 = Pathway.objects.filter(reaction__name='A + B >> C') qs3 = Pathway.objects.filter(inputer__name='WeizhongTu') ~~~ 解决办法 ~~~ # 合并到一起 qs = qs1 | qs2 | qs3 这个时候就有可能出现重复的 # 去重方法 qs = qs.distinct() ~~~