Django 的orm

各个文件夹代表的


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)


原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11347073.html