0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マイクロソフト Access を利用した、Djangoの学習入門(モデル編その1)

0
Posted at

この記事では、Django 6.0 から、マイクロソフト Access のデータベースファイル(.accdbファイル)を操作しております。
django-msaccess パッケージを使います。settings.pyDATABASES の変更が必要です。

settings.py
DATABASES = {
    'default': {  
        'ENGINE': 'django-msaccess',  
        'ODBC': '{Microsoft Access Driver (*.mdb, *.accdb)}',  
        'PATH': 'C:\\Work\\MyNewDatabase.accdb(Accessデータベースファイルのフルパス)',  
        'DEBUG': False,  
        'TRUNCATENAME': True,  
    },
}

このような設定にしてください。

インストール編の記事

は、あまりにも文章が長くご迷惑をおかけしましたので、今回はできる限り簡潔を心がけます。
お付き合いの程、よろしくお願いします。

1.はじめに

 一般的な Django の学習記事では、インストールが終われば次に学ぶことは、『Webページの作り方』のテーマになるかもしれません。
確かに、ブラウザを使って作成したページを見れば、学習の実感が湧くでしょうし楽しくなります。
しかしこの記事の読者層は、マイクロソフト Access の開発者を中心にしていますので、その興味の対象は『Webページの作り方』よりも、むしろ、Django からどのようにすれば『データベース操作』ができるのか?という点にあるかと思います。
そのデータベース操作は、Django では、モデル操作とも呼ばれ、models.py のファイルの中に記述し、その中のオブジェクトなどを利用したプログラムを作成します。
そこで、ここでは一般の Django の学習では後の方で触れられるモデル操作を最初にお話ししたいと思います。

2.settings.py の確認

 マイクロソフト Access のデータベースファイルを操作するために、settings.py の中の DATABASES の設定が、この記事の冒頭のようになっていることを確認してください(インストール編で解説した通りにします)。
 またここでは、

インストール編で作成したフォルダをそのまま使用しています

settings.py のフルパスは、
"C:\Work\DJLearn\DJLearn\settings.py"
ここにあります。

また、Python言語では、万が一のトラブルを防ぐために、仮想環境を使用しています。なお仮想環境は必須ではありませんので、ご自分のパソコンを自由にお使いできるのであれば、仮想環境は不要かもしれません。
この記事を最初に読まれる方は、『インストール編』の該当箇所をご確認ください。

3.学習用のアプリを登録しましょう

 settings.py ファイルが存在する DJLearn フォルダは、Djangoプロジェクト全体に関わる設定やシステム管理用アプリなどを収容しますので、今回の学習目的のアプリを収容するには相応しくありません。
そこで新しく、学習用アプリを、このプロジェクトに追加します。
manage.py ファイルが存在する場所をカレントディレクトリにして、次のコマンドを入力します。

新しいアプリの登録を行う
python manage.py startapp アプリケーションの名前

アプリの名前を L01 としました(Lesson-1)。
startappコマンドによって、プロジェクトにアプリケーションを登録します。

venv\scripts\activateを実行してPython仮想環境の中で作業しています
C:\Work>venv\scripts\activate

(venv) C:\Work>cd DJLearn

(venv) C:\Work\DJLearn>python manage.py startapp L01

(venv) C:\Work\DJLearn>dir
2026/01/12  15:16    <DIR>          .
2026/01/12  15:16    <DIR>          ..
2026/01/12  15:07    <DIR>          DJLearn
2026/01/12  15:16    <DIR>          L01
2026/01/12  15:05               685 manage.py
               1 個のファイル                 685 バイト

startappコマンドによって、L01フォルダが作成されました。この中にL01アプリに関するファイルが収容されます。

(venv) C:\Work\DJLearn>dir L01
2026/01/12  15:16    <DIR>          .
2026/01/12  15:16    <DIR>          ..
2026/01/12  15:16                66 admin.py
2026/01/12  15:16                86 apps.py
2026/01/12  15:16    <DIR>          migrations
2026/01/12  15:16                60 models.py
2026/01/12  15:16                63 tests.py
2026/01/12  15:16                66 views.py
2026/01/12  15:16                 0 __init__.py
               6 個のファイル                 341 バイト

(venv) C:\Work\DJLearn>dir L01\migrations
2026/01/12  15:16    <DIR>          .
2026/01/12  15:16    <DIR>          ..
2026/01/12  15:16                 0 __init__.py
               1 個のファイル                   0 バイト

アプリケーションの migrations フォルダは、まだ空っぽであることに注意してください。
インストール編でも触れましたが、このフォルダの中に、models.py に加えた変更記録が保存されていきます。

4.settings.py に、アプリを登録します

 startapp コマンドは、アプリの雛形ファイルを作成するコマンドで、Djangoプロジェクトとしては、まだこのアプリを認識していません。そこで、このアプリをプロジェクトで認識できるように settings.py の次の個所にアプリを登録します。

settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

この最後の行に、 'L01.apps.L01Config' と追加します。

settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'L01.apps.L01Config'
]
L01.apps.L01Config 意味
L01 フォルダの名前。アプリの名前と同じです。
apps apps.py のファイルの名前です
L01Config apps.pyファイルの中に、次の宣言があります。class L01Config(AppConfig): このclass宣言の名前です

Python言語で、外部ファイルの中に宣言されている関数やクラスなどを参照する表記方法になっています。

5.models.py を編集します

 インストール編でも説明しましたが、Django を使う上では、データベースを直接触らないことが重要になります。
Accessのデータベースファイルの中に、新しいテーブルを作成する場合、普通は、製品版AccessのGUI画面を表示させて [作成]メニュー[テーブル] で新しいテーブルを作ったり、 [デザインビュー] でテーブルの列を修正したりします。
Django では、このような操作をできる限り控えるようにします。Django 自身が、接続先データベースの管理を models.py ファイルを通して行うため、models.py の内容と、データベースのテーブルの定義に、不一致を発生させないためです。
 データベースのテーブルに関する操作は、この models.py ファイルに記述します。
アプリケーションを新規に登録した後の models.py の内容は、実質的な意味はありません。

models.py
from django.db import models

# Create your models here.

アプリケーションを新規に作成した直後は、このようなファイルが作成されています。

この models.py の中に、次のように変更を加えてみます。

models.py
from django.db import models

# Create your models here.
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class Person(models.Model):
このクラス宣言は、テーブルの名前に対応します。つまり、データベースのPersonテーブルを表します(なお、この状態では、データベース側には、アプリ名が付加されたテーブルになります。後述)。
models.Modelは、必要です。Djangoのシステムで定義されたModelクラスを継承してPersonクラスを作成するという意味になります。

first_name = models.CharField(max_length=30)
このクラス変数宣言は、列を表しています。
クラス変数の名前(first_name)が、列名を表しています。
但し、データベース側の名前で使える文字の種別と、クラス変数名で使用できるPythonの文法上の文字の種別は一致しません。
例えば、列の名前に、空白や記号文字が許される場合がありますが、これらの文字は、Python変数の名前には使用できません。
このような場面では、db_columnオプションが必要になります(次回以降に解説します)。

models.CharField で、列のデータ型を宣言します。CharFieldは、文字列型です。引数に型の属性値を記述します。
max_length=30 で、最大30文字となります。

このように、データベースのテーブルに対応する宣言を、models.py の中で行います。

6.makemigrations コマンドの実行

 Djangoプロジェクト内のアプリの models.py を修正したら、makemigrations コマンドを実行して、その修正結果をファイル化します。
今、L01アプリの models.py に、テーブルPersonを追加したので、makemigrations コマンドを実行します。

(venv) C:\Work\DJLearn>python manage.py makemigrations
Migrations for 'L01':
  L01\migrations\0001_initial.py
    + Create model Person

アプリのmigrationsフォルダに、models.py に対する変更結果が、保存されます。

(venv) C:\Work\DJLearn>dir L01\migrations
2026/01/12  16:25    <DIR>          .
2026/01/12  16:25    <DIR>          ..
2026/01/12  16:25               580 0001_initial.py
2026/01/12  15:16                 0 __init__.py
2026/01/12  15:43    <DIR>          __pycache__
               2 個のファイル                 580 バイト

フォルダの中に、0001_initial.py ファイルが作成されました。

[どのようなSQL文が実行されるか?事前に調べることができます]
makemigrationsコマンドで作成されるファイルは、Pythonのプログラムになっています。このプログラムからどのようなSQL文が実行されるのかを調べることができます。
python manage.py sqlmigrate L01 0001
sqlmigrate コマンドを実行します。

0001ファイルの実行に相当するSQL文を調べる
(venv) C:\Work\DJLearn>python manage.py sqlmigrate L01 0001
--
-- Create model Person
--
CREATE TABLE [L01_person] ([id] COUNTER NOT NULL PRIMARY KEY, [first_name] varchar(30) NOT NULL, [last_name] varchar(30) NOT NULL);

L01アプリの、0001番マイグレーションファイルの実行内容を、SQL文で表示する命令です。
テーブル作成命令であることがわかります。
sqlmigrate コマンドはSQL文の表示だけを行い、まだ、実際のデータベースの変更は行っていません。

7.migrate コマンドの実行

 makemigrations コマンドで、models.py ファイルの変更結果をファイル化したら、その変更内容をデータベースに反映させます。この作業によって、データベースのテーブルに関する保守作業が行われることになります。データベース側の管理ツールを使わずに、migrate コマンド操作で済ませることできます。
migrate コマンドを実行すれば、AccessのデータベースにPersonテーブルが作成されるはずです。やってみましょう。

(venv) C:\Work\DJLearn>python manage.py migrate
Operations to perform:
  Apply all migrations: L01, admin, auth, contenttypes, sessions
Running migrations:
  Applying L01.0001_initial... OK

製品版Accessをお持ちの方は、settings.py の中で定義されたAccessのデータベースファイルを開いてください。Personテーブルが見えると思います。
実際に作成されたテーブルの名前には、アプリ名が付加されます(L01_person)。

Accessランタイム実行環境の方は、前回紹介したテーブル表示プログラムを実行して下さい。

Djangoからは、

CREATE TABLE [L01_person] (
    [id] COUNTER NOT NULL PRIMARY KEY, 
    [first_name] varchar(30) NOT NULL, 
    [last_name] varchar(30) NOT NULL)

このようなSQL文が実行されました。今回、テーブルに主キーを付けていないので、自動的に連番が主キーになります。

8.レコードを登録してみよう

 マイクロソフト Access のデータベースファイルの中に、テーブルが作成されました。このテーブルにレコードを登録してみましょう。
Django では、プロジェクトを開いた段階ですぐにデータベース操作を行うことができます。
shell コマンドで、プロジェクトを開きます。

(venv) C:\Work\DJLearn>python manage.py shell
13 objects imported automatically (use -v 2 for details).

Python 3.14.2 (tags/v3.14.2:df79316, Dec  5 2025, 17:01:40) [MSC v.1944 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

L01アプリで作成した Personテーブルを参照します(データベース側では、L01_personです)。
Personテーブルのレコードをすべて取得してみましょう。
Person.objects.all()
と実行します。

>>> Person.objects.all()
<QuerySet []>

この段階では、テーブルを作成しただけなので、レコードは1件もありません。
QuerySet []は、レコードが存在しないことを表しています。

Djangoのバージョン5.2以上から、shell コマンドでプロジェクトを開くと、自動的にmodels.pyの中で宣言されているテーブルが読み込まれています(Automatic models import in the shell)。この機能のおかげで、Person が認識されています。
5.2より古いDjangoのバージョンでは、次のようなエラーが発生します。

>>> Person.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'Person' is not defined

Personという名前が認識できていません。
この場合は、L01アプリの models.py モジュールの読み込みが必要です。

>>> from L01.models import Person
>>> Person.objects.all()
<QuerySet []>

Personの参照宣言を行ってください。

この objects は、モデルマネージャ と呼ばれるオブジェクトで、データベースのテーブルに関する操作は、このモデルマネージャを通して行います。
Access の VBA プログラミングで Access データベースを操作するときに、DAO や ADO などのオブジェクトを使いますが、Djangoでは、models.py の中で宣言されたモデルクラス名とモデルマネージャを使ってデータベース操作を行います。

all()は、テーブルのすべてのレコードを取得するメソッドです。
Personテーブル(データベース側ではアプリの名前が付加されたL01_person)のすべてのレコードを取得する命令になります。

新しいレコードを登録する方法は、次のように行います。

>>> member=Person()
>>> member.first_name='家康'
>>> member.last_name='徳川'
>>> member.save()
>>> del member
>>> member=Person()
>>> member.first_name='秀忠'
>>> member.last_name='徳川'
>>> member.save()
>>> del member
>>> member=Person()
>>> member.first_name='家光'
>>> member.last_name='徳川'
>>> member.save()
>>> del member
>>> Person(first_name='家綱', last_name='徳川').save()
>>> Person(first_name='綱吉', last_name='徳川').save()
>>> Person(first_name='家宣', last_name='徳川').save()

上記プログラムでは明示的にdel命令を使用して生成されたオブジェクトを
破棄していますがdel命令を省略しても問題はありません

新しいレコードを登録するためには、モデルクラス(Person)のインスタンスを生成し(member=Person())、saveメソッド(member.save())を実行します。
saveメソッド実行後も、そのインスタンスは存在していますので、今、登録したレコードを変更することができます。

登録したレコードを取得してみます。

>>> Person.objects.all()
<QuerySet [<Person: Person object (1)>, <Person: Person object (2)>, <Person: Person object (3)>, <Person: Person object (4)>, <Person: Person object (5)>, <Person: Person object (6)>]>
>>> Person.objects.all().values_list()
<QuerySet [(1, '家康', '徳川'), (2, '秀忠', '徳川'), (3, '家光', '徳川'), (4, '家綱', '徳川'), (5, '綱吉', '徳 川'), (6, '家宣', '徳川')]>
>>> Person.objects.all().values_list('first_name')
<QuerySet [('家康',), ('秀忠',), ('家光',), ('家綱',), ('綱吉',), ('家宣',)]>
>>> Person.objects.all().values_list('first_name','last_name')
<QuerySet [('家康', '徳川'), ('秀忠', '徳川'), ('家光', '徳川'), ('家綱', '徳川'), ('綱吉', '徳川'), ('家宣', '徳川')]>

本当にAccessのデータベースにレコードが登録されているのでしょうか?

製品版Accessをお持ちの方は、テーブルを開いて確認ができますが、ここでは、次のVBScriptを実行してみます。

show_record.vbs
Option Explicit
Dim dbPath, tableName
dbPath = "C:\Work\MyNewDatabase.accdb"
tableName = "L01_person"

Dim objConn, objRS
Dim strConn

Set objConn = CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath
objConn.Open strConn

Set objRS = CreateObject("ADODB.Recordset")

' テーブルを直接開く
' 第2引数に接続オブジェクト、第3引数に adOpenStatic (3)、
' 第4引数に adLockReadOnly (1)、第5引数に adCmdTable (2) を指定します
objRS.Open tableName, objConn, 3, 1, 2

If objRS.EOF Then
    WScript.Echo "データがありません。"
Else
    Do Until objRS.EOF
        WScript.Echo "ID: "   & objRS.Fields("ID").Value & _
                     " / 名前: " & objRS.Fields("first_name").Value & _
                     " / 姓名: " & objRS.Fields("last_name").Value
        
        objRS.MoveNext
    Loop
End If

objRS.Close
objConn.Close
Set objRS = Nothing
Set objConn = Nothing
WScript.Echo "処理が完了しました。"
C:\Work>C:\Windows\SysWOW64\cscript //nologo show_record.vbs
ID: 1 / 名前: 家康 / 姓名: 徳川
ID: 2 / 名前: 秀忠 / 姓名: 徳川
ID: 3 / 名前: 家光 / 姓名: 徳川
ID: 4 / 名前: 家綱 / 姓名: 徳川
ID: 5 / 名前: 綱吉 / 姓名: 徳川
ID: 6 / 名前: 家宣 / 姓名: 徳川
処理が完了しました。

Accessのテーブル(L01_person)に、レコードが登録されたことがわかります。

モデルマネージャ(objects)が現在管理しているレコード総数は、count()メソッドを使います。

>>> Person.objects.all().count()
6

この命令をそのまま解釈すると、Person テーブルのすべてのレコードを取得し( .all())、そのレコード個数を数える( count() )と読めます。
しかし実際は、次のSQL文が発行されます。

SELECT COUNT(*) AS [__count] FROM [L01_person]

全てのレコードは取得されません。レコード件数だけを取得します。
モデルマネージャはクエリ命令の最適化を行います。

9.レコードを検索しましょう( filter メソッド)

9.1 filterメソッド

>>> Person.objects.filter(first_name='家康')
<QuerySet [<Person: Person object (1)>]>
>>> member=Person.objects.filter(first_name='家康')
>>> print(member)
<QuerySet [<Person: Person object (1)>]>
>>> print(member.values_list())
<QuerySet [(1, '家康', '徳川')]>

レコードの検索方法は、getメソッドを使う方法と、filterメソッドを使う方法があります。getメソッドはレコードの検索というよりは、レコードの取得になります。getメソッドについては、後で触れます。

ここでは、filterメソッドの説明をします。

filterメソッドの基本形は、その引数に、検索を行う列名とその値を書くことです。
Person.objects.filter(first_name='家康')
first_name列の値が、'家康'となっているレコードの検索を行います。

9.2 AND条件

>>> Person.objects.filter(first_name='家康', last_name='徳川')
<QuerySet [<Person: Person object (1)>]>
>>> Person.objects.filter(first_name='家康', last_name='徳川').values_list()
<QuerySet [(1, '家康', '徳川')]>

filterメソッドの引数が複数個あるときは、AND条件になります。
Person.objects.filter(first_name='家康', last_name='徳川')
これは、first_name列の値が'家康'であり、かつ(AND)、last_name列の値が'徳川'であるレコードの検索を行います。

>>> member=Person.objects.filter(first_name='家康', last_name='山川')
>>> print(member.values_list())
<QuerySet []>

values_listメソッドは、検索で得られたクエリセットを、タプル形式で編集を行う命令です。

9.3 OR条件

OR条件の指定方法は少々難しく、Djangoの ORM(オブジェクトリレーショナルマッパー) で使用されるクエリオブジェクトの Q を使います。
深入りすると入門を超えますので、次のように指定を行うと暗記します。

OR条件は、Q()|Q() 形式です。

>>> from django.db.models import Q
>>> members=Person.objects.filter( Q(first_name='家康') | Q(first_name='家宣') )
>>> print(members.values_list())
<QuerySet [(1, '家康', '徳川'), (6, '家宣', '徳川')]>

Q は、事前に参照されないので、明示的に読み込む必要があります。
from django.db.models import Q の宣言を最初に行います。

Q(first_name='家康') | Q(first_name='家宣') 形式は、
first_name列の値が、'家康'
または
first_name列の値が、'家宣'
のレコードを検索します。

9.4 より大きい、以上(等号が入る)、の検索

id(主キー列)が数字3より大きいところを見てみましょう。
アンダースコアを2個記述した、__gt を使います。

>>> members=Person.objects.filter(id__gt=3)
>>> print(members.values_list())
<QuerySet [(4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家宣', '徳川')]>

この主キーは小文字です。大文字のIDではありません。

なお、Djangoでは、主キーの名前を、小文字の pk で表現することができます。モデルクラスの中に pk プロパティとして組み込まれています。

>>> members=Person.objects.filter(pk__gt=3)
>>> print(members.values_list())
<QuerySet [(4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家宣', '徳川')]>

idが数字4以上のところを見てみましょう。__gteです

>>> members=Person.objects.filter(id__gte=4)
>>> print(members.values_list())
<QuerySet [(4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家宣', '徳川')]>

9.5 より小さい、以下(等号が入る)、の検索

gtの逆はltを使います。

idが数字3未満の所は

>>> members=Person.objects.filter(id__lt=3)
>>> print(members.values_list())
<QuerySet [(1, '家康', '徳川'), (2, '秀忠', '徳川')]>

idが、4以下の所は

>>> members=Person.objects.filter(id__lte=4)
>>> print(members.values_list())
<QuerySet [(1, '家康', '徳川'), (2, '秀忠', '徳川'), (3, '家光', '徳川'), (4, '家綱', '徳川')]>

9.6 リスト検索(候補値リストと一致するレコード)

リスト検索は、
列名__in=[候補値リスト]
で行います。

idが、1,3,5の所は

>>> members=Person.objects.filter(id__in=[ 1, 3, 5 ])
>>> print(members.values_list())
<QuerySet [(1, '家康', '徳川'), (3, '家光', '徳川'), (5, '綱吉', '徳川')]>

first_name列が、'秀忠', '家綱', '家宣'のレコードは、

>>> members=Person.objects.filter(first_name__in=[ '秀忠', '家綱', '家宣' ])
>>> print(members.values_list())
<QuerySet [(2, '秀忠', '徳川'), (4, '家綱', '徳川'), (6, '家宣', '徳川')]>

9.7 部分文字列検索

'家'という文字が含まれているfirst_name列のレコードは、

>>> members=Person.objects.filter(first_name__contains='')
>>> print(members.values_list())
<QuerySet [(1, '家康', '徳川'), (3, '家光', '徳川'), (4, '家綱', '徳川'), (6, '家宣', '徳川')]>

列名__contains と書きます。文字列の部分一致検索となります。
英文字の大小は区別されますので注意します。

>>> members=Person.objects.filter( Q(first_name__contains='') | Q(first_name__contains='') )
>>> print(members.values_list())
<QuerySet [(1, '家康', '徳川'), (3, '家光', '徳川'), (4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家宣', '徳 川')]>

__contains のところを、__icontains にすると、英字の大小は区別されなくなります。

9.8 前方一致、後方一致の文字列検索

文字列の先頭から検索するときは、前方一致検索の命令がありますので、それを使います。
前方一致検索は、__startwith です。英字の大小を区別しない時は、__istartwith です。
後方一致検索は、__endwith です。英字の大小を区別しない時は、__iendwith です。

データベース側の文字列検索では、英字の大小や日本語の半角・全角の違いなど、文字の意味は同じに見なせる文字を区別するか、同一視するかなどの検索をするときの設定があります。

>>> Person(first_name='Audrey', last_name='Hepburn').save()
>>> Person.objects.filter(first_name='audrey').values_list()
<QuerySet [(7, 'Audrey', 'Hepburn')]>

filter(first_name='audrey')は、first_name列の値が、英小文字の'audrey'のレコードを探しに行きます。

SELECT [L01_person].[id], [L01_person].[first_name], [L01_person].[last_name] 
  FROM [L01_person] WHERE [L01_person].[first_name] = ?
params=('audrey',)

このようなSQL文が発行されます(パラメータ付きクエリ)。英小文字の'audrey'を探しに行きますが、実際は、英大文字で始まる'Audrey'を見つけます。
ODBCを経由してデータベースにSQL文が投げられますので、最終的な検索はデータベース側の設定になります。
このため、Django側で期待しているレコードと、実際に返されるレコードが異なることがあります。検索条件に文字列を使用するときは、注意が必要です。英字の大小を区別したり、日本語文字の半角や全角を区別するときなどは注意します。

10 レコードの並べ替え

レコードの並べ替えは、order_by('列名') とします。

>>> Person.objects.filter(first_name__in=[ '秀忠', '家綱', '家宣' ]).order_by('first_name').values_list()
<QuerySet [(4, '家綱', '徳川'), (6, '家宣', '徳川'), (2, '秀忠', '徳川')]>

昇順の並べ替えになりますが、漢字が使用されている時は、その判別は難しいかもしれません。

列名にマイナスを付けると降順になります。

>>> Person.objects.filter(first_name__in=[ '秀忠', '家綱', '家宣' ]).order_by('-first_name').values_list()
<QuerySet [(2, '秀忠', '徳川'), (6, '家宣', '徳川'), (4, '家綱', '徳川')]>
>>> members=Person.objects.filter(first_name__contains='').order_by('-id')
>>> print(members.values_list())
<QuerySet [(6, '家宣', '徳川'), (4, '家綱', '徳川'), (3, '家光', '徳川'), (1, '家康', '徳川')]>

11.レコードの更新

レコードの更新は、検索条件を入れて、該当レコード取得して、1レコードずつ更新します。

>>> member=Person.objects.get(first_name='家光', last_name='徳川')
>>> member.last_name='徳川将軍家です'
>>> member.save()

レコードの取得は、getメソッドを使います。引数の検索条件に該当するレコードを取得します。
1レコード分の取得を行いますので、検索条件の絞り込みが不十分で複数レコードに該当した場合はエラーが発生しますので、注意してください。その逆に、1レコードも取得できな時もエラーになります。get メソッドを使用するときは、例外発生時のエラー処理を組み込みます。

>>> member=Person.objects.filter(last_name__contains='将軍')
>>> print(member.values_list())
<QuerySet [(3, '家光', '徳川将軍家です')]>

>>> members=Person.objects.filter(first_name__contains='')
>>> for mem in members:
...     print(mem.first_name)
...
家康
家光
家綱
家宣

>>> members=Person.objects.filter(first_name__contains='')
>>> for mem in members:
...     mem.first_name = mem.first_name + 'さん'
...     mem.save()
...
>>>
>>> members=Person.objects.filter(first_name__contains='')
>>> print(members.values_list())
<QuerySet [(1, '家康さん', '徳川'), (3, '家光さん', '徳川将軍家です'), (4, '家綱さん', '徳川'), (6, '家宣さん', '徳川')]>
>>> print(members.values_list('first_name'))
<QuerySet [('家康さん',), ('家光さん',), ('家綱さん',), ('家宣さん',)]>

12.レコードの削除

レコードの削除は、deleteメソッドです。

>>> Person.objects.all().values_list('id','first_name')
<QuerySet [(1, '家康さん'), (2, '秀忠'), (3, '家光さん'), (4, '家綱さん'), (5, '綱吉'), (6, '家宣さん')]>

>>> mem=Person.objects.get(id=3)
>>> mem.delete()
(1, {'L01.Person': 1})
>>> Person.objects.all().values_list('id','first_name')
<QuerySet [(1, '家康さん'), (2, '秀忠'), (4, '家綱さん'), (5, '綱吉'), (6, '家宣さん')]>

>>> Person.objects.filter(first_name__contains='').delete()
(3, {'L01.Person': 3})
>>> Person.objects.all().values_list('id','first_name')
<QuerySet [(2, '秀忠'), (5, '綱吉')]>

>>> Person.objects.filter(Q(first_name='秀忠')|Q(first_name='綱吉'))
<QuerySet [<Person: Person object (2)>, <Person: Person object (5)>]>
>>> Person.objects.filter(Q(first_name='秀忠')|Q(first_name='綱吉')).values_list()
<QuerySet [(2, '秀忠', '徳川'), (5, '綱吉', '徳川')]>
>>> Person.objects.filter(Q(first_name='秀忠')|Q(first_name='綱吉')).delete()
(2, {'L01.Person': 2})
>>> Person.objects.all()
<QuerySet []>

13.まとめ

 今回は、マイクロソフト Access のデータベースの中に簡単なテーブルを作成し、レコードを登録して、検索や更新、削除の基本について学びました。
学びの中心は、Djangoのモデル操作方法です。

今使用しているデータベースは、マイクロソフト Access ですが、データベースが Access から SQL Server に置き換えられたとしても、モデルの操作方法は一緒です。どのデータベースになっても、モデルの操作方法は変わりません。これが、Djangoを使用する上の大きな利点、特徴になります。

次回は、もっとモデルに関する知識を深めていきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?