加载中...

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)
posted @ 2024-05-08 17:58  江寒雨  阅读(33)  评论(0)    收藏  举报