[] DjangoのORM動作#1--2019-08-17 6時11分59秒

オリジナル:http://blog.gqylpy.com/gqy/260

「@

追加:データの移行や耐マイグレーション


# 迁移:
python manage.py makemigrations  # 纪录变成
python manage.py migrate  # 迁移到数据库

# 反迁移:
python manage.py inspectdb > models.py
执行后,会在执行的文件内写入模型类(文件可随意指定)

I.はじめに


コンセプト

オブジェクトリレーショナルマッピング(オブジェクト関係マッピング、ORMと呼ぶ)モデルは、現象を解決し、既存のリレーショナルデータベースと一致しないために、オブジェクト指向の基礎です。

単にときORMの記述オブジェクトとデータベース間のマッピング使用することにより、入れたメタデータを、プログラムが自動的にリレーショナルデータベースに永続中国をオブジェクトします。

ブリッジなどのビジネスロジック層とデータベース層の働きとのORM。
***

由来

のは、O / Rで始めましょう これは「対象」(オブジェクト)O文字に由来し、Rが「関係」(リレーショナル)から誘導されます。

ほとんどすべてのソフトウェア開発プロセスのは、オブジェクトとリレーショナルデータベースを含むことになります。ユーザーレベルとビジネスロジック面では、我々はオブジェクト指向です。情報は変更されることがありますとき、私たちは、リレーショナルデータベースに格納された情報をターゲットにする必要があります。

開発への以前のアプローチによるが、追加読み取り、変更、データを削除するクラッタプログラマのSQL文の多くになり、これらのコードは、多くの場合、独自のビジネス・ロジック・コードに繰り返して発生します。
** *

優位

主な問題は、マッピングROMオブジェクトと関係によって解決され、それは通常、テーブルのインスタンスに対応するクラスは、各クラスの属性テーブルには、各フィールドに対応する各レコードのクラスとの対応表です。

ORMは、単にデータベース操作からのデータなど、オブジェクトの動作として、直接SQLコードを記述せずにデータベースへのマッピングを提供します。

ソフトウェア開発者は、ビジネスロジックの処理に焦点を当てて開発効率を向上させるためにしてみましょう
***

恵まれません

ROMの欠点は、プログラムの効率をある程度犠牲にされるということです。

以上とのORMは、SQL文は、関連変性を書き、リレーショナルデータベースのスキルはできません...
***

概要

ORMツールは本当に否定できないいくつか繰り返し、単純な労働力を、解決することができ、唯一のツールです。

しかし、我々はすべての問題きっぱりと、または特別な処理を必要とするいくつかの特殊な問題を解決するためのツールを期待することはできません。

しかし、小さくすべき特別な処理を必要とする場合は、ソフトウェア開発プロセス、全体でそれ以外のいわゆるツールは、その存在の意味が失われます。

二、中DjangoのORM


MySQLを使ってDjangoプロジェクト

Djangoプロジェクトのsettings.pyファイル内の設定1.データベース接続情報:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 将后缀改为mysql
        'NAME': "数据库名",
        'HOST': "数据库IP",
        'PORT': "端口",
        'USER': "远程用户",
        'PASSWORD': "远程用户密码",
    }
}

*** 2 settings.py __init__.pyファイルと同じレベルに次のコードを追加し、伝えるDjangoはpymysqlモジュールは、MySQLデータベースに接続し使用しています***

import pymysql
pymysql.install_as_MySQLdb()

ジャンゴのMySQLdbは、デフォルトで使用されますが、MySQLdbはそうはpymysqlを変更するには、我々はPython3.xで使うもののPython2.xバージョンです。
***

モデル

ジャンゴでは、モデルは、データの単一、決定的なソースであり、それはあなたの格納されたデータの重要な分野と動作が含まれています。典型的には、モデル(モデル)は、データベーステーブルにマッピングされます。

基本情報:

  • 各モデルはdjango.db.models.ModelのサブクラスであるPythonのクラスです
  • モデルの各属性は、データベースのフィールドを表し
  • 要約すると、Djangoは見、あなたのために自動的に生成されたデータベースアクセスAPIを提供し、公式文書リンクを

DBとのORMとの関係:
ここに画像を挿入説明
***

はじめに

次の例では、名前と性別が含まれている人物モデルを定義しています。

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=24)
    sex = models.CharField(max_length=24)

==名前と性別は、フィールドモデル、各フィールドは、各属性は、データベース列にマップされ、属性として指定されている。==

上記のPersonモデルは次のようなデータベーステーブルを作成します。

create table myapp_person (
  id   serial      not null primary key,
  name varchar(24) not null,
  sex  varchar(24) not null
);

いくつかの説明:

  1. テーブル名(myapp_person)が自動的に生成され、あなたがテーブル名をカスタマイズしたい場合は、あなたがクラスメタモデルにDB_Tableのパラメータを指定する必要があり、==は強く、バックエンドのデータベースとしてMySQLを使用する場合は特に、小文字のテーブル名を使用することをお勧めします。==
  2. idフィールドが自動的に追加し、主キーです。あなたはIDまたは他の指定されたプライマリキーを追加したくない場合は、ただ一つのフィールドでのAutoFieldを指定します(PRIMARY_KEY =真)にすることができます。あなたはid列を追加したくない場合は、Field.primary_keyを設定することができます。
  3. Djangoはバックエンドのデータベースの種類のプロファイルに指定され、対応するSQL文に応じて生成されます。
  4. DjangoはMySQL5.5以降のバージョンをサポートしています。

    三、ORM共通フィールドとパラメータ


    共通のフィールド

1.自動フィールド

int型自動インクリメント、あなたはパラメータを渡す必要があります。PRIMARY_KEY =真の
あなたは自動インクリメントでモデルを指定しない場合は、自動的にIDを自動インクリメントという名前のフィールドを作成します。

2. IntegerFieldと

整数型(INT)は
、〜-2147483648 2147483647:範囲署名さ
4,294,967,295 0:符号なしの範囲を。

例:

# 设置性别: 1, 2为存的值; "男", "女"为显示的值.
sex = models.IntegerField(choices=((1, '男'), (2, '女')))

3. CharFieldです

文字タイプ(VARCHAR)、MAX_LENGTHパラメータを提供しなければならない。
MAX_LENGTH文字長を示す。

AのForeignKey(書籍、on_delete = models.CASCADE)

4. ForeignKeyの

外部キーを作成するために使用されます

構文例:

class Press(models.Model):  # 出版社
    p_name = models.CharField(max_length=24)

class Author(models.Model):  # 作者
    a_name = models.CharField(max_length=24)

class Book(models.Model):  # 书籍
    b_name = models.CharField(max_length=24)

class Relation(models.Model):  # 书籍, 作者, 出版社对应关系
    # 关联3个外键
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    press = models.ForeignKey(Press, on_delete=models.CASCADE)

**一度作成、外部キーフィールド名が自動的に「_id」サフィックスを追加します。**

5.のDateField

日付フィールド、日付フォーマット:YYYY-MM-DDは、
Pythonのdatetime.date()インスタンスに対応します。

6. DateTimeField型

時間フィールド、フォーマット:YYYY-MM-DD HH: MM [:ssは[.uuuuuu] [TZ]が
。Pythonでdatetime.datetimeの()例対応

パラメータ:

  • auto_now_add:作成時間
  • auto_now:修正

7. dalate()

削除

使用法:

类名.objects.filter(字段名="条件").delete()

フィールドコレクション

AutoField(Field)
        - int自增列,必须填入参数 primary_key=True

    BigAutoField(AutoField)
        - bigint自增列,必须填入参数 primary_key=True

        注:当model中如果没有自增列,则自动会创建一个列名为id的列
        from django.db import models

        class UserInfo(models.Model):
            # 自动创建一个列名为id的且为自增的整数列
            username = models.CharField(max_length=32)

        class Group(models.Model):
            # 自定义自增列
            nid = models.AutoField(primary_key=True)
            name = models.CharField(max_length=32)

    SmallIntegerField(IntegerField):
        - 小整数 -32768 ~ 32767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整数 0 ~ 32767
    IntegerField(Field)
        - 整数列(有符号的) -2147483648 ~ 2147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整数 0 ~ 2147483647

    BigIntegerField(IntegerField):
        - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

    BooleanField(Field)
        - 布尔值类型

    NullBooleanField(Field):
        - 可以为空的布尔值

    CharField(Field)
        - 字符类型
        - 必须提供max_length参数, max_length表示字符长度

    TextField(Field)
        - 文本类型

    EmailField(CharField):
        - 字符串类型,Django Admin以及ModelForm中提供验证机制

    IPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

    GenericIPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
        - 参数:
            protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
            unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"

    URLField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证 URL

    SlugField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

    CommaSeparatedIntegerField(CharField)
        - 字符串类型,格式必须为逗号分割的数字

    UUIDField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

    FilePathField(Field)
        - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
        - 参数:
                path,                      文件夹路径
                match=None,                正则匹配
                recursive=False,           递归下面的文件夹
                allow_files=True,          允许文件
                allow_folders=False,       允许文件夹

    FileField(Field)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

    ImageField(FileField)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
            width_field=None,   上传图片的高度保存的数据库字段名(字符串)
            height_field=None   上传图片的宽度保存的数据库字段名(字符串)

    DateTimeField(DateField)
        - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD

    TimeField(DateTimeCheckMixin, Field)
        - 时间格式      HH:MM[:ss[.uuuuuu]]

    DurationField(Field)
        - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

    FloatField(Field)
        - 浮点型

    DecimalField(Field)
        - 10进制小数
        - 参数:
            max_digits,小数总长度
            decimal_places,小数位长度

    BinaryField(Field)
        - 二进制类型

ORMフィールドの対応関係のデータベースフィールド

'のAutoField': '整数AUTO_INCREMENT'、
'BigAutoField': 'BIGINT AUTO_INCREMENT'、
'BinaryField': 'LONGBLOB'、
'のBooleanField': 'ブール'、
'CharFieldです': 'VARCHAR(%(MAX_LENGTH)S)'、
' CommaSeparatedIntegerField ':' VARCHAR(%(MAX_LENGTH)S)」、
'DateFieldに': '日付'、
'DateTimeField型': '日時'、
'DecimalFieldは': '数値(%(max_digits)S、%(decimal_places)S') 、
'DurationField': 'BIGINT'、
'FileFieldに': 'VARCHAR(%(MAX_LENGTH)S)'、
'FilePathField': 'VARCHAR(%(MAX_LENGTH)S)'、
'FloatField': '倍精度'、
'IntegerFieldと': '整数'、
'BigIntegerField': 'BIGINT'、
'IPAddressField': '文字(15)'、
'GenericIPAddressField': '文字(39)'、
'NullBooleanField': 'ブール'、
'OneToOneField': '整数'、
'PositiveIntegerField': '整数UNSIGNED'、
'PositiveSmallIntegerField': 'SMALLINT UNSIGNED'、
'SlugField': 'VARCHAR(%(MAX_LENGTH)S)'、
' SmallIntegerField ': 'SMALLINT'、
'テキストフィールド': 'LONGTEXT'、
'TimeField': '時間'、
'UUIDField': '文字(32)'、


カスタムフィールド

from django.db import models


# 自定义字段类
class FixedCharField(models.Field):
    """自定义的char类型字段类"""

    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        """限制生成数据库表的字段类型为char,长度为max_length指定的值"""
        return 'char(%s)' % self.max_length


# 表结构类
class Class(models.Model):
    varchar_type = models.CharField(max_length=32)  # 自带的varchar类型
    char_type = FixedCharField(max_length=32)  # 自定义的char类型

上記のコードは、テーブル構造を作成し、以下の通りであります:

mysql> desc app01_class;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| varchar_type | varchar(32) | NO   |     | NULL    |                |
| char_type    | char(32)    | NO   |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

フィールドパラメータ

1.ヌル

フィールドがnullにすることができます指定し
たデータベースのヌル直接操作、およびしばしば真=空白を使用しています。
ブランク= TRUE:フィールド空のORMを許可します

2.ユニーク

唯一のテーブルのフィールドを指定します

3. db_index

フィールドインデックスを指定します。

4.デフォルト

フィールドのデフォルト値を設定します

5. DateFieldに与DateTimeField型

パラメータ:

  • auto_now_add:あなたがデータレコードを作成すると、現在の時刻がデータベースに追加されます
  • auto_now:あなたがデータレコードを更新するたびにフィールドを更新します


第四に、関係フィールド


多くのForeignKey

外部キーは、ORM内の外部キー関係のタイプを示すために使用される。
「多」側の「多く」に設定された通常のForeignKeyフィールドを。

ForeignKeyのは、テーブルやその他の関連付けを行うことができます、だけでなく、自分自身の関連付けを行うことができます。

フィールドパラメータ

1.へ

関連していると、テーブルを設定します

# 语法:
属性名 = models.FreignKey(to="类名")

2. to_field

関連しているフィールドを設定します

例:

from django.db import models

class Test01(models.Model):
    test01 = models.CharField(max_length=32, unique=True)
    # 注意:外键的值必须唯一,所以写上 uniuqe=True
    
class Test02(models.Model):
    # 关联Test01表的test01字段
    test02 = models.ForeignKey(to='Test01', to_field='test01')

とき、「テーブル名_set」の代わりに、元の逆引き参照の使用リバース操作フィールド名。

例えば:

from django.db import models

class Department(models.Model):
    name = models.CharField(max_length=32)

class Employees(models.Model):
    name = models.CharField(max_length=32)
    dep = models.ForeignKey(to='Department')  # 外键

我々は(すべての学生に関連付けられたクラスを照会したい場合は、ルックアップ逆時間)、我々は書くことができます。

models.Department.objects.first().employees_set.all()

我々はパラメータに追加するとForeignKeyのフィールドをrelated_name、

dep = models.ForeignKey(to='Department', related_name='emps')

この時点で、私たちはクラス協会(内のすべての学生照会する逆引き参照時間)を、我々は書くことができます。

models.Department.objects.first().emps.all()

逆クエリ操作、テーブル名を置き換え接続接頭辞。

5. on_delete

あなたがテーブルを関連付けられているデータを削除すると、現在のテーブルの行の動作は、それに関連付けられています。

  1. models.CASCADE: == ==あなたが関連付けられているデータを削除し、デフォルト値は、また、削除された行と関連しています。
  2. :models.DO_NOTHINGあなたが関連付けられているデータを削除すると、エラーが発生IntegrityError
  3. models.PROTECT:あなたがエラーを引き起こして、関連するデータを削除ProtectedError
  4. models.SET_NULL:関連するデータを削除し、値は、それに関連する(FKフィールドが空に設定する必要があるという条件)ヌルであります
  5. models.SET_DEFAULTは:デフォルト値に設定し、それらに関連付けられた関連するデータ値を削除します(FKのフィールドは、デフォルト値を設定するものとします)
  6. models.SET:次のように関連付けられたデータを再定義する、関連したデータを削除し、指定された値として定義することができ、それは、実行可能ファイルへの戻り値として定義することができます。
def func():
    return 10

class Test(models.Model):
    user = models.ForeignKey(
        to='user',
        # 可执行对象的返回值
        on_delete=models.SET(func)
    )

6. db_constraint

データベースに外部キー制約を作成するかどうかは、デフォルトはTrueです。
***

ワンOneToOneField

==つのフィールドは、典型的には==既存のフィールドを拡張するために使用されています

一つの関連付けは、で使用される:テーブルの異なるフィールドギャップの問い合わせ周波数が大きすぎる場合、元の2つのテーブルに配置されたテーブル内のオープンフィールドに格納され、その後、一から二テーブルを確立することができます協会

例:

class Author(models.Model):
    name = models.CharField(max_length=32)
    info = models.OneToOneField(to='AuthorInfo')  # 一对一

class AuthorInfo(models.Model):
    phone = models.CharField(max_length=11)
    email = models.EmailField()

フィールドパラメータ

1.へ

関連していると、テーブルを設定します

2. to_field

テーブルの関連するフィールドを設定するには

3. on_delete

ForeignKeyのフィールドと
***

多くの-のManyToManyField

多くの多の関係を表すために使用される。
==、データベース内の3番目のテーブルを作成します。==
3番目のテーブルを介して確立対多の関係を。

フィールドパラメータ

1.へ

関連していると、テーブルを設定します

ForeignKeyのフィールド
の代わりに、元の逆引き参照の逆の操作、「テーブル名_set」のために使用されるフィールド名

ForeignKeyのフィールド
逆クエリ操作、テーブル名を置き換え接続接頭辞。

4.対称

操作を逆に内部フィールドを作成するには、デフォルトがTrueであるかどうかを指定します。

例えば:

class Dep(models.Model):  # 部门
    name = models.CharField(max_length=32)

class Emp(models.Model):  # 员工
    name = models.CharField(max_length=32)
    dep = models.ManyToManyField(to='Dep')  # 未创建反向操作字段
    
# 此时,Emp对象没有person_set属性,不可反向查询
class Dep(models.Model):  # 部门
    name = models.CharField(max_length=32)

class Emp(models.Model):  # 员工
    name = models.CharField(max_length=32)
    dep = models.ManyToManyField(to='Dep', symmetrical=False)  # 创建反向操作字段

# 此时,Emp对象就可以使用person_set属性进行反向查询.

5を介して

ManyToManyFieldフィールドを使用している場合、Djangoは自動的に多くの多の関係を管理するためのテーブルを生成します。
このパラメータを使用することにより、我々は、手動で、多くの関係を管理する第三のテーブルを作成することができます。

6. through_fields

テーブルの関連するフィールドを設定するには

構文:

through_fields(field1, field2)
# field1:指定ManyToManyField的模型外键的名
# field2:指定关联目标模型的外键名

7. DB_Tableの

第三のテーブルはデフォルトでは、データベースのテーブルの名前で作成された場合。

三つの方法対多の関係

独自の第三のテーブルを作成します。

from django.db import models


class Book(models.Model):
    name = models.CharField(max_length=32, verbose_name="书籍名称")


class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")


# 自行创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
    author = models.ForeignKey(to='Author')
    book = models.ForeignKey(to='Book')


    class Meta:
        unique_together = ('author', 'book')

ManyToManyFieldで3番目のテーブルを自動的に作成します

from django.db import models


class Book(models.Model):
    name = models.CharField(max_length=32, verbose_name="书籍名称")


# 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to='Book', related_name='authors')

ManyToManyFieldを設定し、3番目の表作成の指定

from django.db import models


class Book(models.Model):
    name = models.CharField(max_length=32, verbose_name="书籍名称")


# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to='Book', through='Author2Book', through_fields=('author', 'book'))
    # through_fields接收一个2元组('field1', 'field2')
    # 其中field1指定定义ManyToManyField的模型外键的名(author)
    # field2是关联目标模型的外键名(book)


class Author2Book(models.Model):
    author = models.ForeignKey(to='Author')
    book = models.ForeignKey(to='Book')

    class Meta:
        unique_together = ('author', 'book')

注意:
私たちは第三リレーショナル表の追加フィールドを格納する必要があるときは、第三の方法を使用する必要があります。

しかし、我々は関係-多くを使用する第三の方法を作成するとき、あなたは多くの関係を管理するために、追加、削除、明確な方法をセットを使用することはできません、と必要性は第3のモデルテーブルを通じて多くの関係を管理します。

メタメッセージ

メタを別のクラスを含むORM対応するクラスは、メッセージクラスは、メタデータベースの一部をカプセル化します。次のように主なフィールドは、次のとおりです。

  • DB_Tableの: DB_Tableの書き換え可能なテーブルでAPP_クラス名にデータベーステーブル名はデフォルトでORM。
  • index_together:共同インデックス
  • unique_together:ユナイテッドユニークインデックス
  • 順序:のみ、このプロパティを設定し、フィールドはデフォルトのソートされているかを指定は、我々は結果が逆転することができ照会()。

その他のアクションは、以下を参照してください[] DjangoのORM動作#2

オリジナル:http://blog.gqylpy.com/gqy/260

おすすめ

転載: www.cnblogs.com/bbb001/p/11367268.html