Djangoとデータベースの相互作用の実現


1プロジェクトデータベースの作成方法
まず、仮想マシンデータベースにプロジェクトと同名のデータベースを作成し、管理しやすいです。

(django_test) bd@DF:~$ mysql -u admin -p
パスワードを入力して、データベースに入ります。

mysql> SHOW DATABASES;
現在の既存のデータベースをすべて調べて、データベースを作成します。

mysql> CREATE DATABASE 'django_test';
という名前があります。testのデータベース。

+--------------------+
| Database           |
+--------------------+
| information_schema |
| django_test        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.10 sec)
2データベースとdjangoの相互作用を行います。
データベースがあったら、私たちはこのライブラリをプロジェクトに配置して、関係バインディングを行う必要があります。
まずsettings.pyファイルのDATABASESの一つです。

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',   #      
        'NAME': 'django_test',  #       
        'USER': 'admin',  #   
        'PASSWORD': 'yourpassword',  #      
        'HOST': '127.0.0.1',   #       IP
        'PORT': '3306'  #      (   ubuntu       ,       3306,         3306)
    }
}
デフォルトの設定をコメントして、自分のデータベース情報を持って転送します。
在这里插入图片描述
mysqlデータベースを操作する必要があるので、仮想環境にpymysqlをインストールする必要があります。

pip install mysql -i https://pypi.douban.com/simple
豆瓣源を使うと早いです。そしてpip listは自分がpymysqlを持っているかどうかを確認します。あったら、プロジェクト総目次の下の_u u u uに入ります。init_.pyファイル

import pymysql
pymysql.install_as_MySQLdb()
2行のコードを追加して、マップのインポートを完了します。それから、私たちはデータベースのインタラクションを行うアプリの中のmodels.pyが必要です。

from django.db import models

# Create your models here.
class User(models.Model):
    # id = models.AutoField(primary_key=True)  #             
    name = models.CharField(max_length=30)
    age = models.IntegerField(null=True)
    sex = models.IntegerField(null=True)
    city = models.CharField(max_length=30, null=True)
    note = models.TextField(null=True)
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)
ここでは多くの項目を定義して、対応するデータの種類は注意が必要です。括弧の中の限定情報も注意が必要です。データの種類:
タイプ
説明
AutoField
自動的に成長するInteger Fieldは、通常は指定せず、指定しないと自動的に属性名がidという自動成長属性を作成します。
Boolean Field
ブールフィールド、値はTrueまたはFalseです。
Null Boolean Field
Null、True、Falseの3つの値をサポートします。
Char Field
文字列、パラメータmax_lengthは最大文字数を表します。
Text Field
大きなテキストフィールドは、一般的に4000文字以上の場合に使用されます。
Integer Field
整数
Decimal Field
十進数浮動小数点、パラメータmax_digitsは総桁数を表し、パラメータdecimal_placesは小数点以下の桁数を表します。
Flooat Field
浮動小数点
DateField
日付,パラメータnowはオブジェクトを保存するたびに、このフィールドを現在の時刻として自動的に設定します。「最後の変更」のタイムスタンプは、常に現在の日付を使用します。デフォルトはFalseです。パラメータnow_addは、オブジェクトが最初に作成されたときに、現在のタイムスタンプを自動的に設定し、常に現在の日付を使用しています。デフォルトはFalseです。パラメータnow_addとatot_nowは反発し合っていますので、組み合わせが間違っています。
TimeField
時間、パラメータはDateFieldと同じです。
DateTimeField
日付時間、パラメータはDateFieldと同じです。
FileField
ファイルフィールドをアップロード
ImageField
FileFieldに継承し、アップロードの内容を検証し、有効な画像であることを確認する。
限定条件:
オプション
説明
null
Trueであれば、許容値は空であり、デフォルト値はFalseです。
ブラック
Trueであれば、フィールドは空白となり、デフォルトはFalseとなります。
db_column
フィールドの名前が指定されていない場合は、属性の名前が使用されます。
db_index
値がTrueであれば、このフィールドにインデックスを作成します。デフォルトはFalseです。
default
標準値
プリマル.key
Trueであれば、このフィールドはモデルのメインキーフィールドとなり、デフォルトはFalseで、一般的にAutoFieldのオプションとして使用されます。
unique
Trueの場合、このフィールドは表の中で唯一の値が必要です。デフォルトはFalseです。
max_length
フィールドの長さ制限
DateField.atot_now
データを変更する時、更新時間は、save方法を使うと役に立ちます。
DateField.atot_now_add
最初の追加は現在の時間を設定します。変更はできません。
データの導入が完了したら、仮想マシンに移行します。プロジェクトディレクトリに移動します。

python manage.py makemigrations
コマンドの後ろにあるアプリのモデルをマップするように指定します。書かれていない場合は、すべてのアプリがマッピングファイルを作成します。再度の前に、あなたのアプリは全部settingsに登録されたと保証しなければなりません。
移転が完了したら、私達は移動したデータをデータベースに提出する必要があります。

python manage.py migrate
移転は、私たちがuserクラスで定義したデータをcreate tableというmysql文に変換して、文をデータベースに提出して表を作成するということを理解できます。
作成が完了したら、データベースで操作が完了したかどうかを確認します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| django_test        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use django_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------+
| Tables_in_django_test |
+-----------------------+
| django_migrations     |
| six_user              |
+-----------------------+
2 rows in set (0.00 sec)

mysql> describe six_user;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| name        | varchar(30) | NO   |     | NULL    |                |
| age         | int(11)     | YES  |     | NULL    |                |
| sex         | int(11)     | YES  |     | NULL    |                |
| note        | longtext    | YES  |     | NULL    |                |
| create_time | datetime(6) | NO   |     | NULL    |                |
| update_time | datetime(6) | NO   |     | NULL    |                |
| city        | varchar(30) | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
ここでまずショーを行います。ライブラリを確認して、プロジェクトデータベースに入ります。six_を選択してください。ユーザーが表を表示します。データテーブルの作成が完了しました。
テーブルを変更する必要があるなら、モデルクラスだけを変更してもいいです。モデルクラスにフィールドを追加する必要があるなら、直接に増やすことはできません。空のフィールドを追加すると論理エラーがあります。つまり、自分が空(追加するときは空)のフィールドを追加することは許可されていませんので、括弧にnull=Trueを追加する必要があります。
上のモデル類のcityフィールドのように、追加が完了したら、移動と提出をすればいいです。上の二つのステップです。削除も同じです。つまり、モデルクラスを更新するなら、上の2つのステップが必要です。
3データの追加
データを追加したいなら、試してみます。

from django.http import HttpResponse, HttpResponseNotFound
from django.shortcuts import redirect, render
from .models import User
# Create your views here.
def add_user(request):
    #    
    # user = User(name='zjj', age=18)
    # user.save()  #   save        
    # return HttpResponse('    ')

    #    
    # user = User()
    # user.name = 'zj'
    # user.age = 18
    # user.save()
    # return  HttpResponse('    ')

    #    
    # User.objects.create(name='z', age=8)
    # return HttpResponse('    ')

    #      get_or_create           (        ),       ,   ,       ,   ,      。
    user, flag = User.objects.get_or_create(name='z1', age=10)
    message = '    '
    if not flag:
        message = '    '
    print(user.name, user.create_time)
    return HttpResponse(message)
ここではまずmodelsクラスで定義されているUserクラスを導入し、Userクラスの実装を追加することによって、上記の4つの方法を例に挙げたが、最初の2つの方法はsave方法を使用する必要があります。後の2つはオブジェクトを呼び出す方法で直接データを追加するのが便利です。ここでは最後の方法を説明する必要があります。この方法は着信データを判断します。もしデータが入っていないなら、まず作成してデータを取って、Trueに戻ります。ここで私は上記のデータをいくつか試してみます。データを繰り返すと、作成せずにデータに戻り、Falseを追加します。私たちはここで一つの解凍を行い、二つのパラメータを取得して判断します。これでページの情報伝達ができます。

mysql> SELECT * FROM `six_user`;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age  | sex  | note | create_time                | update_time                | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
|  1 | zjj  |   18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
|  2 | zj   |   18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
|  3 | z    |    8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
|  4 | z1   |   10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
4 rows in set (0.00 sec)
そしてもう一つの方法は先端ページにデータを追加し、バックエンドが受信したらデータベースに追加することです。
第1のステップは、ルーティングに受信情報を追加する。

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path(r'add_user/<name>/<age>', views.add_user)
]
表示関数:

def add_user(request, name, age):
    user, flag = User.objects.get_or_create(name=name, age=age)
    message = '    '
    if not flag:
        message = '    '
    print(user.name, user.create_time)
    return HttpResponse(message)
データをフロントエンドで受信して、直接データベースに追加できます。
在这里插入图片描述

mysql> SELECT * FROM `six_user`;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age  | sex  | note | create_time                | update_time                | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
|  1 | zjj  |   18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
|  2 | zj   |   18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
|  3 | z    |    8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
|  4 | z1   |   10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
|  5 | zjjj |   21 | NULL | NULL | 2021-03-10 22:06:47.200072 | 2021-03-10 22:06:47.200101 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
5 rows in set (0.00 sec)
4データの検索
4.1すべてのデータを検索する
データの検索方法は、まず関数を決めてみます。

def find_user(request):
	#       
    user_list = User.objects.all()
    print(user_list)
    return HttpResponse('    ')
ルートを追加してください。そして私達はモデルの下で魔法の方法を使ってprint方法を修正します。

    def __str__(self):
        return 'id=%s, name=%s, age=%s, city=%s, note=%s' % (self.id, self.name, self.age, self.city, self.note)
私たちはprintデータの時によく見られます。
在这里插入图片描述
上はすべてのデータを調べます。どのようにデータを調べますか?
4.2データを調べる

def find_user(request):
	#       
    user = User.objects.get(id=1)
    print(user, type(user))
    return HttpResponse('    ')
在这里插入图片描述
ここで注意したいのは、get方法は唯一のデータを検索するためのもので、もし入力した条件が唯一ではないならば、直接にエラーを報告します。複数のデータを調べますか?
4.3複数のデータを照会する

def find_user(request):
    #       
    user_list = User.objects.filter(name=18)
    print(user_list, type(user_list))
    return HttpResponse('    ')
ここで私たちはfilterの方法を使います。
在这里插入图片描述
ここで返したのは集合オブジェクトです。

def find_user(request):
    #       
    user_list = User.objects.filter(age=18)
    for user in user_list:
        print(user)
    # print(user_list, type(user_list))
    return HttpResponse('    ')
これで複数のメッセージを返すことができます。
在这里插入图片描述
それだけでなく、オブジェクトをスライスすることもできます。

def find_user(request):
    #       
    user_list = User.objects.filter(age=18)
    # for user in user_list:
    #     print(user)
    # print(user_list, type(user_list))
    print(user_list[0:1])
    return HttpResponse('    ')
モデルチェンジもできます

def find_user(request):
    #       
    user_list = User.objects.filter(age=18)
    # for user in user_list:
    #     print(user)
    # print(user_list, type(user_list))
    # print(user_list[0:1])
    print(list(user_list))
    return HttpResponse('    ')
4データの更新
データを更新するステップは、変更するデータを先に入手して、再割り当てを行います。
4.1データの取得

from django.shortcuts import render
from django.http import HttpResponse
from six.models import User
from django.db.models import Count, Avg, Min, Max, Sum, F, Q
# Create your views here.

#        
def find(request):
    #       
    rs = User.objects.all()

    #        
    rs = User.objects.first()

    #         
    rs = User.objects.last()

    #            
    rs = User.objects.filter(age=18)

    #          ,   get         (   id  ),         ,   try   
    rs = User.objects.get(id=3)
ここは方法が多いですが、必要に応じて来ます。
4.2データの並べ替え

    #      
    rs = User.objects.order_by('age')  #   ,    
    rs = User.objects.order_by('-age')  #   ,    

    #     
    rs = User.objects.order_by('age', '-id')
	
	#              ,          count    
    rs = User.objects.filter(age=28).count()

    #     QuerySet  Model     ,       ,            
    rs = User.objects.all().values()
    for i in rs:
        print(i['name'])
    print(rs)
4.3照会条件

    #       
    #    WHERE       ,           
    #      :   __  ,         
    #   
    rs = User.objects.filter(age=18)

    #         
    rs = User.objects.filter(name__contains='j')

    #   
    rs = User.objects.filter(age__gt=18)

    #     
    rs = User.objects.filter(age__gte=18)

    #   
    rs = User.objects.filter(age__lt=18)

    #     
    rs = User.objects.filter(age__lte=18)

    #       
    rs = User.objects.filter(city__isnull=True)

    #      
    rs = User.objects.filter(name__startwith='z')

    #      
    rs = User.objects.filter(name__endwith='1')

    #          ,            
    rs = User.objects.filter(name__in=['zj', 'zjj', 'zjjjj'])

    #            
    rs = User.objects.filter(age__range=(18, 28))
4.4集約クエリ
Count、Avg、Min、Max、Sumは主にこれらの方法があります。

    from django.db.models import Count, Avg, Min, Max, Sum, F, Q
    #               , Count,Avg, Max, Min, Sum.       
    # aggregate() QuerySet       ,              
    #     
    rs = User.objects.all().aggregate(Count('age'))

    #       
    rs = User.objects.all().aggregate(Avg('age'))

    #       
    rs = User.objects.all().aggregate(Max('age'))

    #       
    rs = User.objects.all().aggregate(Min('age'))

    #     
    rs = User.objects.all().aggregate(Sum('age'))

    #     key                 ,      key  
    rs = User.objects.all().aggregate(ageSum=Sum('age'))
4.5グループクエリ

	#     
    #    QuerySet                
    #            values        ,            ,           
    rs = User.objects.values('age')
    #  age         ,         ,          age       
    rs = rs.annotate(count=Count('age'))
    #         
    rs = User.objects.values('age').annotate(count=Count('age'))
FとQクエリ

from django.db.models import F, Q
	# F          
    #  User         (+1),     -1
    rs = User.objects.all().update(age=F('age') + 1)

    # Q  
    #              ,    Q  
    # & (and) | (or) ~ (not)  
    #      zj     18   
    rs = User.objects.filter(Q(name='zj') | Q(age=18))

    #      zjjj,       28
    rs = User.objects.filter(Q(name='zjjj') & ~Q(age=28))
    print(rs)
    return HttpResponse('    ')
Qクエリは、一般的に論理クエリに使用されます。
ここでは、Djangoとデータベースの相互作用の実現に関する記事を紹介します。これまでの記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。