Djangoの研究では、モデルの高度な使い方を指摘します

複雑なフィールドタイプ

以前の研究の後、私たちは、一方ではフィールド型モデルは、データベーステーブルのカラム名とデータ型を指定することである知っている、一方、タグタイプのHTMLを形成することを決めました。

1.1差分整数型

三種類、即ちのDjangoの整数IntegerFieldとBigIntegerFieldSmallIntegerFieldその範囲を除き、これらの三つのフィールド。Djangoのすべてのサポートされるデータベース、-2147483648から2147483647までの法的範囲でIntegerFieldと。そしてBigIntegerFieldは-9223372036854775808 9223372036854775807に許可された値の範囲である64ビットの整数です。だから、ときに、データベースの移行、特にデータベースはSqliteを、番号の範囲に支払うもっと注意を持っています。SmallIntegerFieldは-32768から32767の範囲です。

違いの1.2インクリメントタイプ

AutoFiledBigAutoFiledはエネルギー自給型のを、彼らは整数型が進化して作られています。AutoFiledはに基づいて実ID IntegerFieldと自動増加です。通常は何のテーブルの主キーが設定されていない場合、Djangoは自動的に自動インクリメントの主キーを追加し、それを使用する必要はありません。BigAutoFieldは実際BigIntegerFieldですが、それはIDが自動的に増加をサポートしています。だから、負のゼロの範囲にすることはできません。

1.3時間タイプ

二つに重要な属性のDateFieldやDateTimeField型auto_nowauto_now_addデフォルト値はFlaseです。auto_nowを提供するか、値をauto_now_addがtrueの場合、このフィールドは偽とブランク= Trueの間接的な編集可能=に設定されています。パラメータ割り付けdatetime.dateオブジェクトを渡す必要があるため。文字列は、時間の文字列である場合は、日付オブジェクトに変換されます。

入力値の形式はサポートのDateField:

['%Y-%m-%d',      # '2006-10-25'
 '%m/%d/%Y',      # '10/25/2006'
 '%m/%d/%y']      # '10/25/06'

入力値の形式はサポートしていDateTimeField型:

['%b %d %Y',      # 'Oct 25 2006'
 '%b %d, %Y',     # 'Oct 25, 2006'
 '%d %b %Y',      # '25 Oct 2006'
 '%d %b, %Y',     # '25 Oct, 2006'
 '%B %d %Y',      # 'October 25 2006'
 '%B %d, %Y',     # 'October 25, 2006'
 '%d %B %Y',      # '25 October 2006'
 '%d %B, %Y']     # '25 October, 2006'

1.4 FilePathField

このフィールドは、ファイルパス情報を格納するために使用されます。デフォルトの最大長は100、MAX_LENGTHにより、カスタムパラメータです。これは、いくつかの重要なパラメータが含まれています。

パス:パラメータを渡します。ディレクトリやファイルへの絶対パスを記録します。たとえば:/home/monkey
マッチ:オプションのパラメータ、それは主に、フィルタに一致するファイル名を、正規表現です。
この再帰的サブディレクトリを含めるかどうかを示すオプションのパラメータを:。デフォルト値Flase。
allow_files:ファイル名が含まれているかどうかを示すオプションのパラメータは、デフォルト値はTrueです。
allow_folders:デフォルト値Flaseを含め、ディレクトリ名かどうかを示すオプションのパラメータ。

Djangoは真のとallow_filesのallow_foldersの間に所定の値を持っている必要があります。

1.5 FileFieldに

アップロードファイルフィールド、フォームで共通します。一般的に、ファイルは、サーバのハードディスクに保存されます。したがって、データベース内のフィールドは、実際にはMAX_LENGTHカスタムパラメータによって、文字列型、100のデフォルトの最大長さ、です。

二つの重要なFileFieldにオプションのパラメータがあります。upload_toストレージ

  • upload_to
    指定されたファイルのアップロードディレクトリupload_to。次のように使用方法は以下のとおりです。
class MyModel(models.Model):
    # 文件上传到 MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # 或者
    # 文件上传到 MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

どのMEDIA_ROOTは、 settings.pyに設定されている、アップロードされたファイルのルートディレクトリを表します。また、設定する必要がMEDIA_URL彼らはすべてのアクセスを可能なファイルをアップロードするためのURLアドレスを表し、。

  • ストレージ
    ストレージは、ファイル操作の対象です。これは、大きさ(パス)、オープン(パス提供 ).read()、(パス)の削除、(パス)が存在するファイルを操作することなどが挙げられます。

1.6のImageField

フィールド画像ファイルを保存します。FileFieldにとのImageField同様の使用法。関連する構成seeting.pyを高める必要性に加えて、upload_toも、共通のフィールドオプションを共有しています。

また、追加オプションの引数を持っている:1であるのheight_field、画像保存の高さを表しています。もう一つは、width_field、保存された画像の幅を表しています。

2関係フィールド

関係フィールドの三種類、役割の定義についての記事前。それらのいくつかの今日のフィールドオプションを話します。

2.1のForeignKey

2.1.1on_delete

Djangoの2.0では、あなたは時に外部キーを追加する必要がありon_deleteオプションを。外部キーは、データベース内の2つのデータテーブル、外部キーはまた、制約行動があることを必要とします。だから、on_delete Djangoのシミュレーションパラメータは、SQLの行動を制約されています。

on_deleteいくつかのオプションの値があります。

  • CASCADE:これはデフォルトのオプションです、削除をカスケード接続するには、明示的に指定する必要はありません。
  • PROTECT:オプションは、時間を削除する場合は、保護モードは、スローされますProtectedErrorエラーを。
  • SET_NULL:ブランキングモード、削除されたとき、外部キーフィールドがあることを条件とする、空に設定されblank=True, null=True、このフィールドはヌルを許可するように定義されています、。
  • SET_DEFAULT:設定されたデフォルト、時間を削除し、デフォルト値への外部キーフィールドセット、外部キーの際の注意に加えて、デフォルト値を定義そう。
  • SET():カスタムエンティティに対応する値。

2.1.2limit_choices_to

異物を制限するための重要なパラメータを関連付けることができる、唯一のModelFormジャンゴ(Djangoのフォームモジュール)と無制限の機能の他のアプリケーションに管理背景で使用することができます。この値は、辞書、辞書機能のリターンを受け入れています

db_constraint
デフォルトでは、このパラメータがTrueに設定され、データベースの制約を表す従ってください。falseに設定されている場合、それは、データの整合性と妥当性を保証するものではありません。

モデルの関連するオブジェクト名の後方参照。主リバース・クエリのために使用される、即ち、ソース・モデル・インスタンスの外部キーは、管理者が、モデルのすべてのインスタンスを戻します。

デフォルトでは、この上司の名前がfooは元モデル名を小文字でfoo_set、です。例えば:

# 在终端下使用 Django
>>>b = Book.objects.get(id=1)
# 其中 entry_set 为默认的 related_name
>>>b.entry_set.all() 
>>>b.entry_set.filter(headline__contains='天龙八部')
>>>b.entry_set.count()

我々はrelated_name =「小説」に設定した場合、上記のコードは、に変更されます:

# 在终端下使用 Django
>>>b = Book.objects.get(id=1)
# 其中 entry_set 为默认的 related_name
>>>b.novels.all() 
>>>b.novels.filter(headline__contains='天龙八部')
>>>b.novels.count()

関係は、ルックアップクエリセット名を逆転します。モデルの名前は、リバース対象モデルからオブジェクトをフィルタリングするために使用されます。次のように具体的な使用方法は次のとおりです。

class Tag(models.Model):
    article = models.ForeignKey(
        Article,
        on_delete=models.CASCADE,
        related_name="tags",
        related_query_name="tag",
    )
    name = models.CharField(max_length=255)

# 现在可以使用 tag作为查询名
Article.objects.filter(tag__name="important")

3つのフィールドオプション

フィールドオプションは、各フィールドにいくつかのプロパティを指定することです。

フィールドのdb_columnは:フィールドの現在のデータベーステーブルの列名を指定します。指定しない場合、Djangoはフィールド名としてフィールド名をデフォルトにします。

db_index:割り当てがTrueの場合、このフィールドのデータベースインデックスを作成します。

db_tablespace:フィールドがセットインデックス、指定したフィールドインデックス用のデータベース・テーブル・スペースのdb_tablespace名となっている場合。また、データベースのサポートの遺骨は、テーブルスペースをサポートしていない使用して見られるように。ない場合は、このパラメータは無駄に設定されています。

編集可能:フィールドが編集できるかどうかを設定し、デフォルトはTrueです。Falseに設定すると、フィールドには管理者またはその他のModelFormには表示されません。また、モデルの検証をスキップします。

error_messages:カスタムエラーメッセージ。パラメータ値は、辞書の種類を受け入れています。主な辞書がnull、空白,, invalid_choice、一意であり 、 そしてunique_for_dat無効の一つ。

help_textに:フロントページにメッセージを表示するために使用されます。)ページがXXSの脆弱性は、(django.utils.html.escapeを使用する必要が存在しないことを保証するためにコンテンツを脱出しました。

unique_for_date:DateFieldのフィールドの名前やDateTimeField型には、唯一の要件は、それぞれの日付フィールド値のためのフィールドであることを表しています。たとえば、タイトルフィールドがunique_for_date =「PUB_DATEを」提供され、その後、Djangoは同じPUB_DATE二つのレコードで同じタイトルを許可しません。

unique_for_month:同様のunique_for_dateと使用法。

unique_for_year:同様のunique_for_dateと使用法。

verbose_name:フィールドのエイリアスを設定します。各フィールドタイプに、ForeignKeyの、のManyToManyField OneToOneFieldと特別な関係の三種類に加えて、第一選択位置パラメータはverbose_nameあります。ユーザーはこのオプションが定義されていない場合は、Djangoは自動的に自動的に作成され、コンテンツがフィールドアンダースコアでプロパティ名ですスペース結果に変換します。

たとえば、この例では、名前を説明していますperson's first name

first_name = models.CharField("person's first name", max_length=30)

アクティブなセットがない場合、それはですfirst name

first_name = models.CharField(max_length=30)

アウターキー、及び一対多ワードフィールド、最初のモデルが必要と関連するパラメータを指定するために使用されるからです。あなたは明示的にキーワードパラメータverbose_nameで指定する必要があります。次のとおりです。

poll = models.ForeignKey(
    Poll,
    on_delete=models.CASCADE,
    verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    verbose_name="related place",
)

必要なときに最初の文字を大文字にしていないverbose_nameまた、Djangoは自動的に最初の文字を大文字にします。

バリ:フィールドのバリデータを実行するためのリスト。たとえばRegexValidator、EmailValidatorください。

4メタデータのメタモデル

抽象モデルに加えて、フィールドに定義されたモデルは、テーブル内の列になります。我々はこのようなモデルになど、データベースのテーブル名をソートするように、いくつかの他の情報を指定する必要がある場合は、我々はメタを使用する必要があります。メタが任意のタイプであり、以下のように、使用されています。

class Author(models.Model):
    name = models.CharField(max_length=40)
    email = models.EmailField()

    class Meta:
        managed = True
        db_table = 'author'

あなたは上記のコードに影響を与えるのだろうか。Djangoのデータベーステーブルの逆モデル生成、DjangoのDB_Tableのデフォルトのバンドと管理された情報による。

私は主にメタの下で、いくつかの重要な属性は、他の属性を使用すると、文書情報を通じて学ぶことができると述べました。

抽象的:抽象= Trueの場合、モデルは抽象モデルとして指定されます。これは、オブジェクト指向プログラミングの抽象基本クラスに対応しています。

プロキシ:プロキシを設定する場合= Trueの場合、プロキシ表現モデルの継承パターンを使用。

DB_Tableの:指定したデータベースのテーブルの名前で現在のモデル。

マネージド:デフォルトの属性値がTrueでは、データベースのテーブルを作成して動作させるためのモデルを表しています。

発注:指定したすべてのオブジェクトのソート生成されたモデル。デフォルトの昇順、フィールド名の前に文字で結合された場合は「 - 」「?。」の文字の疑問符がランダムな配列を表しているかどうかを示す、降順

ordering = ['pub_date']             # 表示按'pub_date'字段进行升序排列
ordering = ['-pub_date']            # 表示按'pub_date'字段进行降序排列
ordering = ['-pub_date', 'author']  # 表示先按'pub_date'字段进行降序排列,再按`author`字段进行升序排列。

verbose_name:モデルセットの別名に。それが指定されていない場合、Djangoはデフォルトで小文字にモデル名を使用します。

verbose_name = "book"
verbose_name = "图书"

verbose_name_plural:単数形と複数の二つの形式がある英単語ので、このプロパティは、複雑なオブジェクトモデルの名前です。中国はverbose_name値と一致しています。このオプションを指定しない場合、デフォルト名は、複数のverbose_nameプラス「S」です。

verbose_name_plural = "books"
verbose_name_plural = "图书"

インデックス:現在のモデルのインデックスリスト。次のように使用方法は以下のとおりです。

from django.db import models

class Customer(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            models.Index(fields=['last_name', 'first_name']),
            models.Index(fields=['first_name'], name='first_name_idx'),
        ]

相続の5モデル

メタ情報設定モデルによれば、継承のモデルは、次の3つのタイプに分けることができます。

5.1抽象モデル

メタモデルクラスは、抽象= Trueのプロパティが含まれています。抽象モデルは、多くの場合、サブクラスは、それがフィールドの合計を保持し、基本クラスとして扱われます。これは、抽象モデルは、データベース内のテーブルを生成しないことは注目に値します。

from django.db import models

# 抽象模型
class Person(models.Model):
    name = models.CharField(max_length=500)
    age = models.PositiveIntegerField()
    
    class Meta:
        abstract = True

# 子模型
class Student(Person):
    school_name = models.CharField(max_length=20)

あなたは、サブモデルのMetaクラスを定義しない場合、それは抽象クラスのメタモデルを継承します。しかし、抽象プロパティは継承されません。

以上5.2テーブル継承

このように、父親の方法でモデルは、サブモデルは、一つ以上のことができます。

モデルは、データベース内の対応するテーブルと、すなわちしない抽象的なモデルでは、通常の親モデルである場合。

モデル層は、多重継承を使用することをお勧めしますが、DjangoのORMまたはそのような使用をサポートしていませんが。各サブモデルの親モデルとマルチテーブル継承は、1対1の関係を追加する場合。

from django.db import models

# 父模型 one
class Model_One(models.Model):
    attr1 = models.CharField(max_length=10)

# 父模型 two
class Model_Two(models.Model):
    attr2 = models.CharField(max_length=10)

# 子模型
class Multiple(Model_One, Model_Two):
    attr3 = models.CharField(max_length=10)

サブクラスORMマッピングは、主キー管理などの最初の親、一般的な外部キー管理などの他の親を選択する多重継承。

5.3エージェントモデル

マルチテーブル継承を使用する場合は、各サブクラスは、親クラスは、新しいデータテーブルを作成します。しかし、私たちはいくつかの方法を拡張したいのですが、データ記憶構造モデルを変更する必要はありません。私たちは、達成するために拘束されたメタクラスでプロキシ=真を増やすことができます。このときサブモデルと呼ばれる親モデルプロキシクラス、サブクラスのメソッドは増やすことができ、およびプロパティが増加することはできません。

from django.db import models
from django.contrib.auth.models import User

class Person(User):
    name = models.CharField(max_length=10)
    
    class Meta:
        proxy = True

    def do_something(self):
        pass

class Man(Person):
    job = models.CharField(max_length=20)

class Woman(Person):
    makeup = models.CharField(max_length=20)

おすすめ

転載: www.cnblogs.com/fengqiang626/p/11972196.html