




Django ORM介绍
目录
一般而言,我们要访问数据库需要通过SQL语法,但在django则是使用ORM技术来访问数据库,django
提供新增、删除、修改、搜索的方法给开发者,语法简单且可防止SQL injection。
对象关联对映(Object-relational mapping, ORM),是一种编程技术,用于实现对象导向编程里不同类型系统的数据之间的转换。 从效果上说,它其实是建立了一个可在程式语言里使用的虚拟物件数据库。 如今已有很多免费和付费的ORM产品,而有些程序员更倾向于建立自己的ORM工具。
新增
首先我们先在stock/templates/stock下建立一个stockCreate.html
stock/templates/stock/stockCreate.html
{% extends 'main/base.html' %}
{% block heading %}股票-新增{% endblock %}
{% block content %}
<form class="inlineBlock" method="post" action="{% url 'stock:stockCreate' %}">
{% csrf_token %}
<p>名稱:<input type="text" name="stockname" value="" required></p>
<p>股價:<input type="text" name="stockprice" value="" required></p>
<p>簡介:<input type="text" name="stockcontent" value="" required></p>
<input class="btn" type="submit" value="新增">
</form>
{% endblock %}
stock/views.py 加入套件与函式
import套件:
from django.contrib import messages
from django.shortcuts import render, redirect <-新增這個
def stockCreate(request):
stockCreatetemplate = 'stock/stockCreate.html'
if request.method == 'GET':
return render(request, stockCreatetemplate)
stockname = request.POST.get('stockname')
if stockname:
stockname = stockname.strip()
if not stockname:
return redirect('stock/stockCreate')
stockprice = request.POST.get('stockprice')
if stockprice:
stockprice = stockprice.strip()
if not stockprice:
return redirect('stock/stockCreate')
stockcontent = request.POST.get('stockcontent')
if stockcontent:
stockconetnt = stockcontent.strip()
if not stockcontent:
return redirect('stock/stockCreate')
Stock.objects.create(name=stockname, price=stockprice, content=stockcontent)
messages.success(request, '新增成功!')
return redirect('stock:stock')
stock/urls.py的urlpatterns加入以下路径
path('stockCreate/', views.stockCreate, name='stockCreate')
删除
stock/templates/stock/stock.html 中的{% for stock in stocks %}区块替换成以下
{% for stock in stocks %}
<p align="left">
<form style="display:inline" method="post" action="{% url 'stock:stockDelete' stock.id %}">
{% csrf_token %}
<input class="btn" type="submit" value="刪除">
</form>
<p>
<h3>名稱:{{ stock.name }}</h3>
<p>當前股價:{{ stock.price }}</p>
<p>簡介:{{ stock.content }}<p>
<hr>
</p>
</p>
{% endfor %}
stock/views.py
最上方既有的django.shortcuts再 import 一個 get_object_or_404
def stockDelete(request, stockId):
stock = get_object_or_404(Stock, id=stockId)
stock.delete()
messages.success(request, '刪除成功!')
return redirect('stock:stock')
stock/urls.py的urlpatterns加入以下路径
path('stockDelete/<int:stockId>/', views.stockDelete, name='stockDelete')
这里的int:stockId是用来传递参数的。
搜寻
第一步于templates/stock 下建立一个stockSearch.html
这里我们用模板标签的写法,因为有可能会有多个地方会用到搜寻这个功能,所以我们将搜寻表单独立一个html,再透过{% include ‘stock/stockSearch.html’ %}放到我们需要用的地方。
stock/templates/stock/stockSearch.html
<form action="{% url 'stock:stockSearch' %}">
<input type="text" placeholder="輸入關鍵字" name="searchTerm" {% if searchTerm %}value="{{ searchTerm }}"{% endif %}>
<input class="btn" type="submit" value="查詢">
</form>
stock/templates/stock/stock.html
...
<h2>{{ stock }}</h2>
{% include 'stock/stockSearch.html' %} <-加到這裡
<p align="right">
...
stock/views.py加入以下code
def stockSearch(request):
searchTerm = request.GET.get('searchTerm')
stocks = Stock.objects.filter(Q(name__icontains=searchTerm)|
Q(price__icontains=searchTerm)|
Q(content__icontains=searchTerm))
context = {'stock':'stock page','stocks':stocks, 'searchTerm':searchTerm}
return render(request, 'stock/stock.html', context)
stock/urls.py的urlpatterns加入以下路径
path('stockSearch/', views.stockSearch, name='stockSearch')
修改
stock/templates/stock 下建立stockUpdate.html
stock/templates/stock/stockUpdate.html
{% extends 'main/base.html' %}
{% block heading %}股票-修改{% endblock %}
{% block content %}
<form class="inlineBlock" method="post" action="{% url 'stock:stockUpdate' stock.id %}">
{% csrf_token %}
<p>名稱:<input type="text" name="stockname" value="{{stock.name}}" required></p>
<p>股價:<input type="text" name="stockprice" value="{{stock.price}}" required></p>
<p>簡介:<input type="text" name="stockcontent" value="{{stock.content}}" required></p>
<input class="btn" type="submit" value="修改">
</form>
{% endblock %}
stock/views.py
def stockUpdate(request, stockId):
stock = get_object_or_404(Stock, id=stockId)
template = 'stock/stockUpdate.html'
if request.method == 'GET':
context={'stock':stock
}
return render(request, template,context)
stockname = request.POST.get('stockname')
stockprice = request.POST.get('stockprice')
stockcontent = request.POST.get('stockcontent')
stock.name=stockname
stock.price=stockprice
stock.content=stockcontent
stock.save()
messages.success(request, '修改成功!')
return redirect('stock:stock')
stock/urls.py的urlpatterns加入以下路径
path('stockUpdate/<int:stockId>/', views.stockUpdate, name='stockUpdate')
补充语法(以Stock model为例)
搜寻
… 为筛选条件
Stock.objects.all()
Stock.objects.get(…)
Stock.objects.filter(…)
Stock.objects.exclude(…)
Stock.objects.order_by(…)
Stock.objects.filter(…). order_by(…)
删除
stock = Stock.objects.get(…)
stock.delete()
新增
… 为数据表各字段资料
1.Stock.objects.create(…)
2.stock = Stock()
stock.name=”台积电”
stock.price=670
..
stock.save()
更新
stock = Stock.objects.get(…)
stock.name=”台积电”
stock.price=670
..
stock.save()
正规流量卡免费办理,长按二维码进入
