day50 DjangoのURLルーティングサプリメントとデータベースの操作
URLエイリアスと逆引き
ルートのエイリアス、場合パスの変更、ビュー機能と参照コードを変更する必要はありません。
書面でのURLのファイル:
url(r'^login/v2/', views.login,name='xx'),
逆解析の観点:
from django.urls import reverse
# 也可以直接从 django.shortcuts 中导入reverse,从源码来看,这两个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 %} <!-- csrf_token 用于防御跨站请求伪造-->
用户名:<input type="text" name="uname">
密码:<input type="text" name="pwd">
<input type="submit">
</form>
ルートの配布を含めます
- プロジェクトフォルダ
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/
]
- 作成した各アプリケーション以下のアプリケーションフォルダ内の
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'),
]
- このフォーマットを使用するときに様々なアプリケーションの各ビュー機能を書き込む、流通経路が必要。
return redirect('app01:index')
URL名前空間
基本的な執筆:
url(r'^app01/', include('app01.urls',namespace='app01')),
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' %}
データベース操作
蛇
オブジェクトリレーショナルマッピング、オブジェクトリレーショナルマッピング
使用します。
- models.py次のドキュメントフォルダ対応するクラスで書かれたアプリケーションは、次の例を参照してください。
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=10)
password = models.CharField(max_length=32)
- MySQLのデータベースには、名前のorm01などのライブラリを作成するには:
create database orm01;
- 構成データベースを実行し、データベースがデフォルト軽量のSQLiteで使用されます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
我々はする必要がありsettings.py
、データベースが次の形式で構成され、文書化して下さい:
#连接mysql的配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'orm01',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123'
}
}
- プロジェクトフォルダ内
__init__.py
のファイルは、以下を書くために指定するには、pymysql
接続クライアントを
import pymysql
pymysql.install_as_MySQLdb()
- 実行データベース同期命令は、端末で実行されます
python manage.py makemigrations #在migrations文件夹下面生成记录文件
python manage.py migrate #执行记录文件
表が作成された、私たちのテーブル名は次のとおりです。クラス名の名前を小文字に_
ターミナルでは、あなたは我々だけのコマンドを介してデータベーステーブルを構築している見ることができます。
テーブルにおける欠失を変更して再検索データ
増加(作成)
モード1
obj = models.UserInfo(
username='alex',
password='sb'
)
obj.save()
実施例2(共通)
models.UserInfo.objects.create(
username='一峰',
password='666'
)
修正
モード1
models.UserInfo.objects.filter(id=1).update(
username='alexxx',
password='bigsb',
)
モード2
obj = models.UserInfo.objects.filter(id=1)[0]
obj.username = 'alex222'
obj.password = '11111'
obj.save()
一括作成します
list_obj = []
for i in range(10):
obj = models.UserInfo(
username='xx%s'%i,
password='66%s'%i,
)
list_obj.append(obj)
print(list_obj)
models.UserInfo.objects.bulk_create(list_obj)
update_or_create
そこに更新され、作成されていません
データがないか、または1つだけあるだけを見つけることができないことに留意すべきです。データの状態は、複数のエラーがある場合。
a,b = models.UserInfo.objects.update_or_create(
username='alex',
defaults={
'id':20,
'password':'ooooo',
'age':84,
}
)
print(a) # 当前更新后的model对象,或者是你新增的记录的model对象
print(b) # 新增就是True,查询就False
[削除]
models.UserInfo.objects.filter(id=1).delete()
お問い合わせ
単純な問合せ
ret = models.UserInfo.objects.filter(id=1)
print(ret) #<QuerySet [<UserInfo: UserInfo object>]> -- []
obj = ret[0]
print(obj.id,obj.username)
クエリメソッド
13のメソッドの合計が、あろう知っているであろう。今日はそのうちの3を議論します:
すべて
ret = models.UserInfo.objects.all()
フィルタとGET
ret = models.UserInfo.objects.get(age=18)
ret = models.UserInfo.objects.filter(age=180)
- 唯一つのデータを取得し得ます。あなたはスーパーのデータを見つけるか、または2つのデータは文句を言うが、リクエストの結果を取得します見つけることができない場合は、そのモデルが返されたオブジェクトです。
# 1 UserInfo matching query does not exist. 啥也没查到
# 2 get() returned more than one UserInfo -- it returned 11! 结果多了,不行!
- fitlerが与えられていない、結果は対象のモデルであるコレクションクエリセットタイプ、です