ORM:关系对象映射。Object Relation Mapping.
数据库与代码:
1)DB first
2)Code first
主流都是Code first.
SQLAlchemy 就是code first.
Django的ORM是code first.
1.创建类
1)根据类自动创建数据库表
app下models.py。
2)根据类对数据库表中的数据进行各种操作
2.迁移
1)在设置目录的settings.py的INSTALLED_APPS中添加APP模块.
2)python manage.py makemigrations 生成数据迁移临时文件
在所有app的migrations目录下回生成一个.py文件
3)python manage.py migrate 生成表
我们在SQLiteStudio中就可以看到。
默认情况下帮我们生成的表明就叫appname_classname
,classname是小写。
=======
增删改查
1.增
方法1
from app02 import models
def orm(request):
models.UserInfo.objects.create(
username='root',
password = '123',
)
方法二:
from app02 import models
def orm(request):
obj = models.UserInfo(username='root', password='123')
obj.save()
return HttpResponse('orm-add')
方式3:
from app02 import models
def orm(request):
dict = {'username':'root', 'password':'123'}
obj = models.UserInfo(**dict) # 注意添加星号
obj.save()
return HttpResponse('orm-add')
2.查
查所有对象
#urls.py
url(r'^orm_query/', views.orm_query),
# views.py
def orm_query(request):
result = models.UserInfo.objects.all()
for row in result:
print (row.id, row.username, row.password)
return HttpResponse('orm_query')
注意:这里查询的result是:
[obj(id, username, password), obj...]
这样的。
Or这样查询:
只查id,username:
models.UserInfo.objects.all().values('id', 'username')
注意:这里的查询结果为:[{"id":xx, "username":xx, "password":xx}]
不管是传递的对象还是字典,在模板中取都是一样的取:
<h1>业务线列表(对象)</h1>
<ul>
{% for row in v %}
<li>{{ row.id }} - {{row.caption}} - {{row.code}}</li>
{% endfor %}
</ul>
<h1>业务线列表(字典)</h1>
<ul>
{% for row in v2 %}
<li>{{ row.id }} - {{row.caption}} - {{row.code}}</li>
{% endfor %}
</ul>
条件查询:
def orm_query(request):
result = models.UserInfo.objects.filter(username='root1')
for row in result:
print (row.id, row.username, row.password)
return HttpResponse('orm_query')
取出前5条数据:
models.Entry.objects.all()[:5]
3.删除
删除所有:
models.UserInfo.objects.all().delete()
条件删除:
models.UserInfo.objects.filter(username='liao').delete()
更新
更新所有:
models.UserInfo.objects.all().update(password='666')
条件更新:
models.UserInfo.objects.filter(id='1').update(username='liao1')
示例,判断登录:
def login(request):
if request.method == 'GET':
return render(request, 'app02/login.html')
elif request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
result = models.UserInfo.objects.filter(username=username, password=password).first() # 也可以count()判断个数
if result:
return redirect('/index/')
else:
return render(request, 'app02/login.html')
示例:
def userinfo(request):
# QuerySet
user_list = models.UserInfo.objects.all()
print (user_list.query)
return render(request, 'app02/userinfo.html', {'user_list':user_list})
user_list是QuerySet。QuerySet里面是一个一个的对象。 [obj,obj,obj...]
,对象中封装了每列的值。
user_list.query是查询语句。
SELECT "app02_userinfo"."id", "app02_userinfo"."username", "app02_userinfo"."password", "app02_userinfo"."liao" FROM "app02_userinfo"
示例:
def userinfo(request):
# QuerySet
user_list = models.UserInfo.objects.all()
print (user_list.count())
return render(request, 'app02/userinfo.html', {'user_list':user_list})
查询到的QuerySet,检查数量使用.count()方法。