當前位置:首頁 » 編程語言 » django原生sql返回前端
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

django原生sql返回前端

發布時間: 2023-08-09 00:52:07

『壹』 求助django 實現前端頁面檢索功能的代碼

設我們的 django 博客應用有如下的文章模型:
blog/models.pyclass Post(models.Model):
# 標題
title = models.CharField(max_length=70)
# 正文
body = models.TextField()

# 其他屬性

def __str__(self):
return self.title

先看到第 1 步,用戶在搜索框輸入搜索關鍵詞,因此我們要在博客上為用戶提供一個搜索表單,html 表單代碼大概像這樣:
<form method="get" action="/search/">
{% csrf_token %} <input type="search" placeholder="搜索" required>
<button type="submit">搜索</button></form>

特別注意在 form 標簽下有一個 {% csrf_token %},這是 django 用來防禦跨站請求偽造(CSRF)攻擊的機制。如果不知道什麼是 CSRF 的話也沒有關系,只要記住在使用 django 時,前端的表單代碼里一定要加上 {% csrf_token %}。
用戶輸入了搜索關鍵詞並點擊了搜索按鈕後,數據就被發送給了 django 後台伺服器。表單的 action 屬性的值為 /search/,表明用戶提交的結果將被發送給 /search/ 這個 URL。我們為這個 URL 綁定一個 django 視圖函數,在這個視圖函數里完成前面第 2 步提到的過程。假設我們把視圖函數的代碼寫在 blog/views.py 里:
blog/views.pydef search(request):
q = request.GET.get('q')
error_msg = ''

if not q:
error_msg = '請輸入關鍵詞'
return render(request, 'blog/errors.html', {'error_msg': error_msg})

post_list = Post.objects.filter(title__icontains=q)
return render(request, 'blog/results.html', {'error_msg': error_msg,
'post_list': post_list})

首先我們使用 request.GET.get('q') 獲取到用戶提交的搜索關鍵詞。用戶通過表單提交的數據 django 為我們保存在 request.GET 里,這是一個類似於 Python 字典的對象,所以我們使用 get 方法從字典里取出鍵 q 對應的值,即用戶的搜索關鍵詞。這里字典的鍵之所以叫 q 是因為我們的表單中搜索框 input 的 name 屬性的值是 q,如果修改了 name 屬性的值,那麼這個鍵的名稱也要相應修改。
接下來我們做了一個小小的校驗,如果用戶沒有輸入搜索關鍵詞而提交了表單,我們就無需執行查詢,而是渲染一個錯誤頁面提示用戶請輸入關鍵詞。
如果用戶輸入了搜索關鍵詞,我們就通過 filter 方法從資料庫里過濾出符合條件的所有文章。這里的過濾條件是 title__icontains=q,即 title 中包含(contains)關鍵字 q,前綴 i 表示不區分大小寫。這里 icontains 是查詢表達式(Field lookups),其用法是在模型需要篩選的屬性後面跟上兩個下劃線。django 內置了很多查詢表達式,建議過一遍 django 官方留個印象,了解每個表達式的作用,以後碰到相關的需求就可以快速定位到文檔查詢其用途:Field lookups
接下來就是渲染搜索結果頁面,顯示符合搜索條件的文章列表,下面是一個模板的簡單示例:
results.html

{% if error_msg %} <p>{{ error_msg }}</p>{% endif %}

{% for post in post_list %} <div>
在這里顯示文章的相應信息 </div>{% empty %} <div class="no-post">
沒有搜索到符合條件的文章 </div>{% endfor %}

有了視圖函數後記得把視圖函數映射到相應了 URL,前面我們表單數據提交的 URL 為 /search/,因此將視圖函數 search 綁定到該 URL 上。
blog/urls.pyurlpatterns = [
# 其他 url 配置
url(r'^search/$', views.search, name='search'),]

大功告成!

『貳』 django是前端還是後端


演示機型:華為MateBookX系統版本:win10

APP版本:django3.0django是用在前端。Django是一個基於Python的Web應用框架。它與Python的另外一個Web框架Flask最大的區別是,它奉行「包含一切」的哲學。該理念即為創建Web應用所需的通用功能都應該包含到框架中,而不應存在於獨立的軟體包中。例如身份驗證、URL路由、模板系統、對象關系映射(ORM)和資料庫遷移等功能都已包含在Django框架中。雖然看上去失去了一些彈性,但是卻可以在構建網站的時候更加有效率。

『叄』 原生sql查詢怎樣返回page對象

最近由於需求變更,客戶需要在原來的查詢基礎上加上一個判斷條件,但是這個判斷條件所在的實體跟原來的查詢實體沒有直接關聯。為了不影響原來的查詢結果,改為用原生SQL,使用left join來關聯查詢。為了不改變對查詢結果的處理邏輯,將查詢結果封裝成原來的對象進行操作。具體操作方法如下:
1.基於JPA規范的程序:
Query query = entityManager.createNativeQuery("select id, name, age from t_user");
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(clazz));
// 其中clazz為封裝對象的class
List rows = query.getResultList();
2.基於Session的程序:
sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS").setResultTransformer(Transformers.aliasToBean(clazz));
這兩種方法需要注意的是查詢的欄位的別名需要跟clazz的屬性對應。

『肆』 python Django 生成sql語句

Django提供了sql,sql_all命令來生成MODEL的SQL語句,當定義好DjangoModel後,可以在初始化調用Syncdb方法來自動在資料庫裡面生成相應的表。

Model定義如下:

classTestModel(models.Model):
Name=models.CharField(max_length=64,blank=True)
>>>fromdjango.core.management.colorimportno_style
#Style是用來輸出語句時著色的
>>>fromdjango.dbimportconnection
>>>fromdjango.db.backendsimportcreation
#這裡面有個類BaseDatabaseCreation,就是用來生成SQL語句的。
>>>T=TestModel()
>>>c=creation.BaseDatabaseCreation(connection)
>>>c.sql_create_model(T,no_style())[0]
['CREATETABLE"abc"( "id"integerNOTNULLPRIMARYKEY, "Theme"varchar(64)NOTNULL ) ;']

這樣就可以通過Django取得這個模型的SQL定義語句了,並且針對不同的資料庫處理Django已經幫做好了。