django的ORM

时间:2022-02-22 11:19:48

在项目根目录下运行 python manage.py shell 即可进入django的交互shell界面

查询

from my_app.models import MyTestModel

datas=MyTestModel.objects.filter(name='my_name')

filter()用于筛选满足条件的子集

exclude()用于筛选不满足条件的子集

filter用于筛选多条结果,返回tuple(query set). 可以在结果上继续应用filter

datas=datas.filter(time='2018-12-21')

大于gt ,大于等于gte ,小于lt , 小于等于lte,中间用双下画下线连接

datas=datas.filter(time__gt='2018-12-21').order_by('name','time')

order_by排序可以是单个字段或多个字段

limit用python的切片表示,切片是左开右闭,数字表示索引,下标从0开始,不支持负数索引 如:[-1]

datas=datas[2:5] 相当于limit(2,3)   sql的limit第一个参数是索引,下标从1开始,不包含该索引的记录,第二个参数是记录数,表示的

含义为,从第二条数据后开始截取3条数据。

like

datas=datas.filter(name__contains="key")  相当于 like '%key%'

django的orm的query也是惰性的,在多次执行filter ,等操作时,它实际上并未进行任何数据库活动,直到返回的数据被用到时才会进行查询。

>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)

这个只会在最后print(q)时执行一次查询操作。

每次执行的返回的queryset都是相互独立的,不受下次filter影响.

>>> q1 = Entry.objects.filter(headline__startswith="What")
>>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
>>> q3 = q1.filter(pub_date__gte=datetime.date.today())

q3是在q1的基础上对pu_date字段经行了过滤

filter获得的结果,即使只有一条记录也会返回一个tuple。 如果已知要获取的结果,有且仅有一条,可以使用get()

datas=datas.get(pk=1)

但是如果没有匹配的结果就会raise 一个DoesNotExist的异常,如果结果多于1条就会raise一个 MultipleObjectsReturned的异常。

创建

from blog.models import Author

joe=Author.objects.create(name="Joe")

joe.save()

对于用户密码的创建要使用create_user()

from django.contrib.auth.models import User

amli=User.objects.create_user(username="Amili",password="someword")

amli.save()