Django补充
Django补充
Url别名解析
path('txx/', views.txx,name = 'txx'), # name 取别名
path('txx1/<int:ssid>/', views.txx1, name='txx1'),
别名反解析
def txx(request):
a = reverse(txx)
print(a)
return HttpResponse("Hello World")
def txx1(request,ssid):
# print(ssid)
# a = reverse(txx)
print(reverse('txx1', kwargs={'ssid': 3, })) # /txx1/3/
return HttpResponse("Hello World")
# html模板渲染语法玩url反向解析
<a href="{% url 'add_book' %}" class="btn btn-primary">添加书籍</a>
<a href="{% url 'edit_book' book.id %}" class="btn btn-warning">编辑</a> # 传参解析,多个参数用空格分隔
<a href="{% url 'del_book' book_id=book.id %}" class="btn btn-danger">删除</a>
<a href="{% url 'del_book' book.id %}" class="btn btn-danger">删除</a>
解决多对多的一些问题
# 设置下拉框默认值
{% for publish in publish_objs %}
{% if publish == old_book_obj.publishs %}
<option value="{{ publish.id }}" selected>{{ publish.name }}</option>
{% else %}
<option value="{{ publish.id }}">{{ publish.name }}</option>
{% endif %}
#CMV路由处理多对多
from django.views import View
class AddBook(View):
def get(self,request):
publish_objs = models.Publish.objects.all()
author_objs = models.Author.objects.all()
return render(request, 'add_book.html', {'publish_objs': publish_objs, 'author_objs': author_objs})
def post(self,request):
authors = request.POST.getlist('authors') # ['3', '4', '5'] #获取多选数据时,用getlist方法
data = request.POST.dict() #注意:含有多选数据时,先提取多选数据,在使用dict,不然,dict会返回多选的最后一个结果值
data.pop('authors') # ['3', '4']
"""
<select name="publishs_id" id="publish" class="form-control">
{% for publish in publish_objs %}
{% if publish == old_book_obj.publishs %}
<option value="{{ publish.id }}" selected>{{ publish.name }}</option>
{% else %}
<option value="{{ publish.id }}">{{ publish.name }}</option>
{% endif %}
{% endfor %}
</select>
# 通过修改name的值 拿到表单的数据时候用publushs_id 获得 以便数据打散使用 解决 一对一表
"""
book_obj = models.Book.objects.create(
**data
# publishs=模型类对象,
# publishs_id=3,
)
book_obj.authors.add(*authors) # ['4', '5'] #解决多表对多表
# return redirect(reverse('books',args=(1,2,3,)))
# return redirect(reverse('books',kwargs={'book_id':1,}))
return redirect('books') #/books/
# 模块速度提取外键
# 在modles类下的函数
def get_authors_name(self):
return ','.join([i.name for i in self.authors.all()])
# 在模板中快速使用函数方法
<td>{{ book.get_authors_name }}</td>
路由分发
总路由
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('app01/', include('app01.urls')), # include -> #app01/urls.py 找到app01目录下的urls.py文件
path('app02/', include('app02.urls')),
path('app03/', include('app03.urls')),
]
# 负责找到app01/ 分发到 include包括的文件下
分发路由
app01下的url
from django.urls import path
from app01 import views
urlpatterns = [
path('index/', views.index),
]
app02下的url
from django.urls import path
from app02 import views
urlpatterns = [
path('index/', views.index),
]
app03下的url
from django.urls import path
from app03 import views
urlpatterns = [
path('index/', views.index),
]
命名空间
因为别名映射在全局上,所以使用路由分发时应该带命名空间
路由分发
总路由
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('app01/', include('app01.urls',namespace='app01')), # include -> #app01/urls.py 找到app01目录下的urls.py文件
path('app02/', include('app02.urls',namespace='app02')),
path('app03/', include('app03.urls',namespace='app03')),
]
# 负责找到app01/ 分发到 include包括的文件下
分发路由
app01下的url
from django.urls import path
from app01 import views
urlpatterns = [
path('index/', views.index),
]
app02下的url
from django.urls import path
from app02 import views
urlpatterns = [
path('index/', views.index),
]
app03下的url
from django.urls import path
from app03 import views
urlpatterns = [
path('index/', views.index),
]
print(reverse('app03:index')) 命名空间名称:别名名称
F查询和Q查询
from django.db.models import F,Q
F查询
from django.db.models import F,Q
# 查询一下点赞数大于评论数的所有书籍
books = models.Book.objects.all()
books_list = []
for book in books:
if book.dianzan > book.comment:
books_list.append(book)
books = models.Book.objects.filter(dianzan__gt=F('comment')) #F('属性名称')
print(books.values('title'))
# 所有书籍价格上调10块钱
books = models.Book.objects.all()
for book in books:
book.price += 10
book.save()
models.Book.objects.all().update(price=F('price')+10) #支持四则运算
Q查询
from django.db.models import F,Q
# Q查询, 多条件查询的时候用的多, or查询
# 查询一下点赞数大于10或者评论数大于10的所有书籍
models.Book.objects.filter(Q(dianzan__gt=10) & Q(comment__gt=10)) #| -- or & -- and ~ -- not
models.Book.objects.filter(dianzan__gt=10, comment__gt=10)
# 点赞数大于10或者评论数大于10的并且价格大于30的
ret = models.Book.objects.filter(Q(Q(dianzan__gt=10) | Q(comment__gt=10)) & Q(price__gt=30)).values('title')
ret = models.Book.objects.filter(Q(dianzan__gt=10) | Q(comment__gt=10) , price__gt=30).values('title')
Q(dianzan__gt=10) | Q(comment__gt=10)通过连接符号连接的Q查询条件,算是一组查询条件
print(ret)
# ~取反 价格小于30的
ret = models.Book.objects.filter(Q(Q(dianzan__gt=10) | Q(comment__gt=10)) & ~Q(price__gt=30)).values('title')
# print(ret)
执行原生sql语句
方式1
ret = models.Book.objects.raw('select * from app01_book;') #raw方法只能操作本表数据
# <RawQuerySet: select * from app01_book;>
# 得到是RawQuerySet类型数据.也是可迭代数据,里面放的是每条记录的模型类对象
for i in ret:
print(i.title)
方式2 connection模块
from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from app01_book;')
ret = cursor.fetchall()
print(ret)
方式3 脱离环境执行
import os
"""
设置 Django 的环境变量。其中 os.environ.setdefault() 方法用于设置环境变量的默认值,确保 Django 在运行时使用指定的设置模块。在这里,设置的是名为 "django_orm.settings" 的 Django 设置模块。
"""
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_orm.settings")
import django
django.setup()
# 确保 Django 的各种组件正确初始化
from app01 import models
ret = models.Book.objects.all()
print(ret)

浙公网安备 33010602011771号