Django 建立项目

url别名和反向解析

写法:url(r'^login/v2/', views.login,name='xx'),
视图中反向解析:
    from django.urls import reverse

    def login(request):
        print(reverse('xx'))  #/login/v2/
        if request.method == 'GET':
        return render(request,'login.html')
    else:
        uname = request.POST.get('uname')
        pwd = request.POST.get('pwd')
        if uname == 'chao' and pwd == '123':

            return HttpResponse('ok')
        else:
            return redirect(reverse('xx'))  #使用反向解析
            
html模板渲染时反向解析的语法{% url 别名 %}
    <form action="{% url 'xx' %}" method="post">
        {% csrf_token %}
        用户名:<input type="text" name="uname">
        密码:<input type="text" name="pwd">
        <input type="submit">
    </form>

include路由分发

1 项目文件夹下的urls.py文件中写上以下内容
    from django.conf.urls import url,include
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01/', include('app01.urls',namespace='app01')), #
        url(r'^app02/', include('app02.urls',namespace='app02')),
        #http://127.0.0.1:8000/index/

    ]

2 在各个app应用文件夹下面创建urls.py文件
    在urls.py文件中写自己应用的各个路径,比如app01 和 app02
    app01:
        from django.conf.urls import url, include
        from django.contrib import admin
        from app01 import views
        urlpatterns = [
            url(r'^index/', views.index,name='index'),
        ]
    app02:
        from django.conf.urls import url, include
        from django.contrib import admin
        from app02 import views
        urlpatterns = [
            url(r'^index/', views.index,name='index'),
        ]



url命名空间

写法:url(r'^app01/', include('app01.urls',namespace='app01')), 
    将每个应用自己的url路径划分一个空间,将来通过别名反向解析时,通过空间名称可以找到对应应用下面的路径
使用:
    views.py文件中写法
        from django.urls import reverse
        def index(request):
            print('app01反向解析:', reverse('app01:index'))
            # app01反向解析: /app02/index/
            return HttpResponse('app01-index')
    html中写法:
        {% url 'app01:login' %}

数据库操作

orm

object relational mapping 对象关系映射

使用:

第一步: 在应用文件夹下面的models.py文件中写对应的类,看下面的示例:

class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)  
    username = models.CharField(max_length=10)
    password = models.CharField(max_length=32)

第二步:做数据库配置,settings.py文件中写上以下配置

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

连接mysql的配置: 
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'orm01',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'USER':'root',
            'PASSWORD':'123'
        }
    }

第三步: 在项目文件夹下的的init文件中写上以下内容,来指定pymysql作为连接客户端

import pymysql
pymysql.install_as_MySQLdb()

第四步: 执行数据库同步指令,在终端中执行

python3.6 manage.py makemigrations  #在migrations文件夹下面生成记录文件
python3.6 manage.py migrate         #执行记录文件

表就创建好了,我们的表名就是: 应用名_类名小写

表中数据的增删改查

创建:
方式一:
obj=models.book_list(
                     book_name='潘金莲后传'
                     publisher='河南出版社'
                     )
                     obj.save()
方式二:
 models.book_list.object.create(
             book_name='潘金莲后传'
              publisher='河南出版社'  )

修改

方式一:
models.book_list.object.filter(id=1).update(
               book_name='潘金莲后传2'
               publisher='河南出版社1'
     )
方式二:
obj=models.book_list.objects.filter(id=1)[0]
obj.book_name='潘金莲后传2'
obj. publisher='河南出版社1'
obj.save()
批量创建:
list_obj = []
for i in range(10):
    obj = models.book(
    book_name = 'xx%s'%i,
    publisger = '北京%s'%i)
    models.book.objects.bulk_create(list_obj)
update_or_create 有就更新,没有就创建
a,b = models.book.objects.update_or_create(
         obj.book_name='潘金莲后传2'
         obj. publisher='河南出版社1'

)
   print(a)  # 当前更新后的model对象,或者是你新增的记录的model对象
    print(b)  # 新增就是True,查询就False

删除

简单查询:
  ret=models.book.objects.filter(id=1)
  就是查询到id为1 的数据 得到一个对象列表
  obj=ret[0]
  就是得到一个列表
  得到列表里的属性就可以使用万能的点
  例如:
    obj.name
    obj.price
    

查询方法:13个方法,必知必会

.all()    jiushi 得到所有的数据
    #filter和get
    # ret = models.UserInfo.objects.get(age=18)
    # ret = models.UserInfo.objects.filter(age=180)
    # get两个报错,但是get请求返回的结果就是那个model对象
    # 1 UserInfo matching query does not exist. 啥也没查到
    # 2 get() returned more than one UserInfo -- it returned 11!  结果多了,不行! 
    # fitler不会报错 返回结果是一个queryset类型的集合,里面是一个一个的model对象
    注意:
    .filter()  就是根据条件进行筛选  从而获得数据
    .exclude()  就是排除满足条件的数据   从而得到剩下的数据   可以和.all().exclude()
         .filter.exclude()  使用
     .order_by('属性')    models.Book.objects.all().order_by('price')根据属性的升序排列
     如果想降序就在属性的前面添加一个'-'号  比如:'-price'
     .count() 统计数据库中对象的数量   ret = models.book.objects.all().count()
     .exists()   检验该数据是否在数据库中
     
    .valuse()   调用指定的属性值  models.book.objects.values('price','name')    
     .values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    <13> distinct():            values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录
 ret = models.UserInfo.objects.all().values('age','username').distinct()               ret = models.UserInfo.objects.values('age','username').distinct()  
   

创建时,日期字段数据的添加方式

models.Book.objects.create(
            # publish_date = "2019-08-01",  字符串
            # publish_date = datetime.datetime.now(), 时间日期数据
        )

猜你喜欢

转载自www.cnblogs.com/x-h-15029451788/p/11907150.html