各个文件夹代表的
Migration:模型操作的迁文件
admin:django admin的后台管理的文件
apps:注册文件
models.py:模型生成的代码-
views.py:视图文件
Manage.py startapp
路由系统>
1.创建app
两种方式:pycharm创建django。加上app名字,
python manage.py startapp + 名字
2.路由的分组
a:将所有的业务逻辑写到app中的views里
urls.py:
b:使用incloud来进行app分组
在其他剩余的app中,添加urls.py文件
在这个app的views中,添加业务处理逻辑
3.路由的分发
A:正则表达式的匹配
urlroutes:
url(r'^test/(w+)(w+)',view.test)
url(r'^test1/(?P<id>w+)(?P<name>w+)',view.test1)
views.py:
def test(request,name,id):
print(id,name)
return Httpresponse('test')
def test1(request, name, id):
print(id, name)
return HttpResponse('test')
?p的约束,传参的时候,会根据顺序来获取参数对应的值
没有约束,传参的时候,会固定的将获取的值传给对应的约束
(自定义404页面)----->
url(r'^',views.notfound),
views:
def notfound(request):
return render(request,'404.html')
B: 反向路由解析:
urls.py:
url(r'^logindadadwd',views.login,name='xxx')
login.html:
<form action="{%url 'xxx' %}" method='post'></form
*** 自定义的 name='m1'
{% url 'm1' %}
-FEV(function based views)
使用函数处理业务逻辑。称作fev
-CBV(class based views)
使用类处理业务逻辑
urls.py:
url(r'^login/', views.Login.as_view()),
views.py:
from django.views import View
class Login(View):
def get(self, request):
return render(request, "login.html")
def post(self, request):
pass
当请求过来的时候, 会优先判断你的请求方法是GET还是POST, 如果是GET请求的话, 走GET函数, 反之, 走POSt函数
Http的请求方法:
'get',:获取信息的
'post':提交数据用post方式
'put', :更新数据
'patch', :部分更新
'delete':删除
form表单的方式, 只支持GET/POST
ajax的方式, 全部支持
type: "POST" 、get、delete
**加函数 .as_view() 另外需要引入view
django的orm(模型model)>
1.创建模型的步骤
a:需要创建一个数据库
b:settings中配置连接
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3', ### 非常小型的文件数据库
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', ## 数据库名称
'USER': 'root',
'PASSWORD': '', ## 安装 mysql 数据库时,输入的 root 用户的密码
'HOST': '127.0.0.1',
}
}
c:在对应的app中的__init__文件下面:
import pymysql
pymysql.install_as_MySQLdb()
d. INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
'classes'
]
2.o r m基本的增删改查
a:创建表
from django.db import models
# Create your models here.
### 一个类对应一张表
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, null=True)
age = models.CharField(max_length=32, null=True)
###一对多的关系
ut =models.ForeignKey('UserType',null=True)不写的话默认自动关联id ut这个变量关联的是usertype一行一行的数据
to--关联哪张表。 to_field 关联的字段
将类转换成实际的表:
python manage.py makemigrations ### 生成迁移文件
python manage.py migrate ### 生成实际的表
b:查
###单表查询
res =models.Userinfo.objects.all()
<Queryset 里面是个列表 包含的是对象
print(res)
for obj in res:
print(obj.username,obj.age)
** values
res =models.Userinfo.objects.values('username','age')
print(res)
<Queryset 里面是列表里面套字典
** value_list
res =models.Userinfo.objects.value_list('username','age')
print(res)
<Queryset 里面是列表套元祖
** first --第一个值
res =models.Userinfo.objects.first()
print(res)--->一个个单个的对象
**加条件
res =models.Userinfo.objects.filter(id__gt=3)==代表where id>3
c:增加
第一种添加方式
models.Userinfo.objects.create(username='kkk',age=12,ut_id=3)
第二种添加方式
userinfo={'username':'ddd','age':'23','ut_id':2}
models.Userinfo.objects.create(**userinfo)
##增加多条记录
d:删除
models.userinfo.objects.filter(id=3).delete()
e:更新
models.userinfo.objects.filter(id=3).update(username='xxx')
3.正反向查询
ut是一个对象,他对应的就是usertype一行的数据
既然是个对象,也可以点出来
正向查询>>>>
---- ut 从userinfo 到usertype查询数据(子到父)
## 获取某一用户所对应的数据类型
res =models.UserInfo.objects.all()
for obj in res:
print(obj.username,obj.age,obj.ut.title)##跨到usertype的title
*************神奇的双下划线----(非常实用)
\
res =models.userinfo.objects.values('username','age','ut__title')
print(res)
\
res =models.userinfo.objects.value_list('username','age','ut__title')
反向查询>>>>
---- ut 从 usertype 到 userinfo 查询里面的数据
需求:-获取所有类型下面的用户
res =models.usertype.objects.all()
###表名小写_set
for obj in res:
print(obj.id,obj.title,obj.userinfo_set.all())
查询的那张表。表名小写 下划线set
### obj.userinfo_set.all() 相当于models.Userinfo.objects.filter(ut_id=1).all()
***********神奇的双下划线
###使用表名小写_ _字段名
res =models.UserType.objects.values('title','userinfo__id','userinfo__age','userinfo__username')
print(res)