環境の準備
- 新しいプロジェクトを作成します
django-admin startproject djangomodel
django-admin startapp App
python manage.py startapp App
- テンプレートやマークを作成します。
- settings.py
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'App',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR,'templates')
],
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'GP1djangomodel',
'PORT':'3306',
'HOST':'localhost',
'USER':'root',
'PASSWORD':'mysql',
}
}
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
- __init__.py
import pymysql
pymysql.install_as_MySQLdb()
- MySQLデータベースを作成します。
mysql> create database GP1djangomodel charset=utf8;
Query OK, 1 row affected (0.17 sec)
- データベースの移行
python manage.py startapp App
今日のコンテンツ
モデル
企業の発展では、我々は通常、データの開発からスタート
開発プロセス
- 設定データベース
- クラス定義モデル(データベース・テーブルに対応するモデルクラス)
- 生成された移行ファイル
- 移行テーブルを実行するためのデータを生成します
モデルクラスのCRUDを使用して(CRUD)操作
蛇
ORM(オブジェクトリレーショナルマッピング)オブジェクト・リレーショナル・マッピング技術は、単に、翻訳者として理解することができるシステムの異なるタイプからオブジェクト指向プログラミング言語データとの間の(データとデータベースとの間の)変換を実現するためのプログラム、核となるアイデアでありますデカップリング切り離され、ビジネスロジックおよびデータベースのSQL文
graph LR
实体-->ORM
ORM-->数据库
graph LR
model-->ORM
ORM-->database
- オブジェクトリレーショナルマッピング
- 翻訳者として理解
- デカップリングの核となるアイデア
ビジネスロジックとSQL減結合
Djangoのモデル定義
- 重要な概念:テーブル、プロパティ、フィールド
- データベース内のテーブルへのモデルの対応は、クラス属性で定義されたモデルは、モデルのフィールドは、テーブルと一致している必要があり
- プロパティファイルで定義されたカスタムプロパティ
- モデルクラスを作成します。
- 人民元オプションのメタは、メタ情報を設定するために、モデルで定義されている(クラス分類)
class Meta:
db_table=xxx #定义数据表名,推荐使用小写字母
ordering = []
#对象的默认排序字段,获取对象列表时使用,通常是integer类型,升序ordering['id'],降序ordering['-id']
データベースのデータ型
- 弦
- デジタル
- 日付時刻
- models.py
from django.db import models
# Create your models here.
#伪装Django模型
class Person(models.Model):
# 约束,用户名不允许重复
p_name = models.CharField(max_length=16,unique=True)
# 默认18岁
p_age = models.IntegerField(default=18,db_column='age')
# False 代表男,True代表女,db_column映射
p_sex = models.BooleanField(default=False,db_column='sex')
#改表名
class Meta:
db_table = 'People'
E:\py27\Django_project\djangomodel>python manage.py makemigrations
Migrations for 'App':
App\migrations\0001_initial.py
- Create model Person
E:\py27\Django_project\djangomodel>python manage.py migrate
Operations to perform:
Apply all migrations: App, admin, auth, contenttypes, sessions
Running migrations:
Applying App.0001_initial... OK
モデルメンバーオブジェクト
デフォルトのオブジェクトモデルで実装Djangoのクエリデータモデルは、オブジェクト
のフィルタレコードに使用Djangoの2つのフィルタを
- フィルタ:フィルタ条件を満たして戻りデータ・セット
- 除外:フィルタ条件を満たしていないデータセットを返します
フィルタは複数の相互に接続し、クエリを除外することができます
模型过滤
* filter
* exclude
* 连续使用
* 链式调用
* Persion.objects.filter(条件).filter(条件).xxx.exclude().exclude()
モデルを作成します。
- djangomodel / urls.py
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url('admin/', admin.site.urls),
url('^App/',include('App.urls')),
]
ユーザーの追加
- アプリ/ urls.py
#conding:utf-8
from django.conf.urls import url
from App import views
urlpatterns = [
url(r'^addpersions/',views.add_persions),
]
- アプリ/ views.py
from django.shortcuts import render,HttpResponse
from App.models import Person
import random
# Create your views here.
def add_persions(request):
for i in range(15):
persion = Person()
flag = random.randrange(100)
persion.p_name = 'Tom%d' %i
persion.p_age = flag
persion.p_sex = flag%2
persion.save()
return HttpResponse("批量创建成功")
クエリユーザー
#conding:utf-8
from django.conf.urls import url
from App import views
urlpatterns = [
url(r'^addpersions/',views.add_persions),
url(r'getpersions/',views.get_persions),
]
- (条件を満たして)フィルタ条件1フィルタ
def get_persions(request):
persion = Person.objects.filter(p_age__gt=18)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- フィルタ条件2
def get_persions(request):
persion = Person.objects.filter(p_age__gt=50)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- フィルタ条件3(カスケーディング・コール)
def get_persions(request):
persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- フィルタ条件4(キック条件を満たす)を除外
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- フィルタ条件5
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
- persionタイプは、クエリの結果セットです
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50).filter(p_age__lt=80)
print(type(persion))
context = {
"persion":persion
}
return render(request,'persion_list.html',context=context)
System check identified no issues (0 silenced).
November 28, 2019 - 11:37:41
Django version 1.11.26, using settings 'djangomodel.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
<class 'django.db.models.query.QuerySet'> #不是列表,但是可迭代
[28/Nov/2019 11:37:41] "GET /App/getpersions/ HTTP/1.1" 200 478
<class 'django.db.models.query.QuerySet'>
[28/Nov/2019 11:37:43] "GET /App/getpersions/ HTTP/1.1" 200 478
- フィルタ基準6
def get_persions(request):
# persion = Person.objects.filter(p_age__gt=50).filter(p_age__lt = 80)
persion = Person.objects.exclude(p_age__lt=50).filter(p_age__gt=80)
print(type(persion))
persiontwo = Person.objects.filter(p_age__in=[40,30,47])
print(type(persiontwo))
context = {
"persion":persion,
"persiontwo":persiontwo
}
return render(request,'persion_list.html',context=context)
- テンプレート/ persion_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>persion_list</title>
</head>
<body>
<h3>PersionList</h3>
<ul>
{% for persion in persion %}
<li>姓名:{{ persion.p_name }} 年龄:{{ persion.p_age }}</li>
{% endfor %}
</ul>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>persion_list</title>
</head>
<body>
<h3>PersionList</h3>
<ul>
{% for persion in persion %}
<li>姓名:{{ persion.p_name }} 年龄:{{ persion.p_age }}</li>
{% endfor %}
</ul>
<ul>
{% for persiontwo in persiontwo %}
<li>姓名2:{{ persiontwo.p_name }} 年龄2:{{ persiontwo.p_age }}</li>
{% endfor %}
</ul>
</body>
</html>
オブジェクトを作成します。
目的:データベースにデータを追加します
あなたがオブジェクトを作成すると、Djangoは唯一のデータベースにオブジェクトを保存するには、データベースと対話するために、Save()メソッドを呼び出したときに、データベースへの読み取りおよび書き込みはありません
注:__ init__はmodels.Modelは、カスタムモデルで使用することができない親クラスで使用されてきました
オブジェクトプログラムを作成します。
在模型类中增加类方法去创建对象
@classmethod
def create(cls,name,age):
在自定义的管理器中添加方法来创建对象
#conding:utf-8
from django.conf.urls import url
from App import views
urlpatterns = [
url(r'^addpersions/',views.add_persions),
url(r'getpersions/',views.get_persions),
url(r'^addperson',views.add_person),
]
- 書き込む必要がありますフィールドを書くように求め
def add_person(request):
person = Person.objects.create(p_name = '小明',p_age = 15,p_sex=True)
person.save()
return HttpResponse('小明创建成功')
方法
- オブジェクトメソッド
- オブジェクトのプロパティを呼び出すことができ、あなたはまた、クラス属性を呼び出すことができます
- クラスメソッド
- あなたはそれが唯一のクラス属性と呼ばれることができ、オブジェクトのプロパティを呼び出すことはできません
- staticメソッド
- その結果、クラスに慣れることができない、オブジェクトのプロパティを取得することはできません、呼び出すことはできません
- 唯一の私たちのクラスにだけ寄生
from django.db import models
# Create your models here.
#伪装Django模型
class Person(models.Model):
# 约束,用户名不允许重复
p_name = models.CharField(max_length=16,unique=True)
# 默认18岁
p_age = models.IntegerField(default=18,db_column='age')
# False 代表男,True代表女,db_column映射
p_sex = models.BooleanField(default=False,db_column='sex')
p_hobby = models.CharField(max_length=32,null=True,blank=True)
#改表名
@classmethod
def create(cls,p_name,p_age=100,p_sex=True,p_hobby='gaming'):
return cls(p_name=p_name,p_age=p_age,p_hobby=p_hobby)
class Meta:
db_table = 'People'
def add_person(request):
# person = Person.objects.create(p_name = '小明',p_age = 15,p_sex=True)
# person.save()
# person = Person(p_age=28)
# 是"" None Null 不能重写__init__ 可以通过其他手段,实现属性自定义赋值
person = Person.create('jack')
person.save()
return HttpResponse('创建成功')