ジャンゴ---共通フィールドとパラメータ

1つのORMフィールド

オートフィールド

int型の自動インクリメント、PRIMARY_KEY = Trueのパラメータを入力しなければなりません。何の自動インクリメントが存在しない場合のモデルは、その後、自動的にID列と呼ばれる列を作成するとき。

IntegerFieldと

整数型、2147483647の範囲-2147483648インチ

CharFieldです

文字型、MAX_LENGTHパラメータ、MAX_LENGTHを示す文字を提供する必要があります。

DateFieldに

日付フィールド、日付形式YYYY-MM-DD、Pythonのdatetime.date()インスタンスに対応します。

DateTimeField型

時刻フィールド、フォーマットYYYY-MM-DD HH:MM [:SS [.uuuuuu] [TZ]、パイソンA datetime.datetimeの()の例に対応

そして、非常に一般的にフィールドで使用されます

2つのORMフィールドパラメータ

ヌル

空にすることができ、フィールドを表すために使用されます。

ユニーク

この表のユニーク= Trueのフィールドへのセットは一意である必要があります。

db_index

db_index場合= Trueの場合、インデックスフィールドは、この目的のために設定されている表します。

デフォルト

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

DateFieldの和DateTimeField型

auto_now_add

現在の時刻をデータベースに追加されるときauto_now_add =真を設定すると、データレコードを作成します。

auto_now

設定auto_now = Trueの場合、データレコードを更新するたびに、フィールドを更新します。

3関係フィールド

外部キー

外部キーは、ORM内の外部キー関係のタイプを示すために使用され、フィールドの一般一つはForeignKeyの「多くは」の「複数」で提供しました。

ForeignKeyのは、同時にテーブルや他の関係を作ることができ、また、自分の関係を作ることができます。

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

フィールドに

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

逆の操作は、フィールド名はテーブル名_set「の代わりに、元の時に逆引き参照のために使用した場合。

例えば:

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

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes")

我々は、すべての学生(逆引き参照)のクラスの関連付けを照会するとき、私たちは書くことができます。

models.Classes.objects.first().student_set.all()

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

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes", related_name="students")

我々は、すべての学生(逆引き参照)のクラスの関連付けを照会するとき、私たちは書くことができます。

models.Classes.objects.first().students.all()

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

on_delete

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

  models.CASCADEは
  また、削除されたことに関連した関連するデータを削除します

  models.DO_NOTHINGは、
  エラーの原因、関連するデータを削除IntegrityError

  models.PROTECTの
  関連エラーを引き起こし、削除データ、ProtectedError

  models.SET_NULL
  関連するデータを削除し、それに関連する値は、(前提FKフィールドが空になるように設定されるべきである)ヌルであります

  models.SET_DEFAULT
  デフォルト値に値セットに関連する関連するデータを、削除(FKの前提フィールドは、デフォルト値を設定する必要があります)

  models.SET

  関連するデータを削除し、
  提供指定値に関連付けられた設定値:models.SET(値)
  の戻り値が提供されるB値関連付けられた実行可能なオブジェクトセット:models.SETを(実行可能なオブジェクト)

def func():
    return 10

class MyModel(models.Model):
    user = models.ForeignKey(
        to="User",
        to_field="id",
        on_delete=models.SET(func)
    )

db_constraint

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

OneToOneField

一つのフィールド。

通常、一つのフィールドには、既存のフィールドを拡張します。

場合クエリ周波数ギャップに異なるテーブル多目的フィールドで一つの関連付けは、この2つのテーブル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()

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

フィールドに

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

on_delete

ForeignKeyのフィールドを持ちます。

ManyToManyField

多くの関係の多くを表すために使用されます。第三テーブルを介して関係を確立するために、データベースに

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

ForeignKeyのフィールドを持ちます。

ForeignKeyのフィールドを持ちます。

対称の

自己多くの関連のためにのみ使用する場合は、逆の操作内でフィールドを作成するかどうかを指定します。デフォルトはTrueです。

例えば:

class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self")

この場合、人物オブジェクトはperson_setプロパティではありません。

class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self", symmetrical=False)

この場合、人物オブジェクトは現在の属性person_set逆引き参照を使用することができます。

スルー

使用のManyToManyFieldフィールドでは、Djangoは自動的に多くの関係に多くを管理するためのテーブルを生成します。

しかし、我々はまた、手動介して第3のテーブルでテーブル名を指定する必要があり、その後、多くの関係を管理する第三のテーブルを作成することができます。

through_fields

それに関連したセット場。

DB_Tableの

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

3つの方法で4対多の関係

一つの方法:独自の第三のテーブルを作成します

class Book(models.Model):
    title = 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番目のテーブルを作成します

class Book(models.Model):
    title = 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")
class Book(models.Model):
    title = 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のモデルテーブルを通じて多くの関係を管理する必要性を使用することはできません。

5元の情報

ORM対応するメタを別のクラスを含むクラス、およびクラスは、いくつかのメタ情報データベースをカプセル化します。次のように主なフィールドは、次のとおりです。

DB_Tableの

デフォルトでは、データベース内のORMのテーブル名がapp_クラス名、次のことができDB_Tableのテーブル名を上書きすることができます。

index_together

共同インデックス。

unique_together

UNITEDユニークなインデックス。

発注

どのようなデフォルトのソートフィールドを指定します。

のみ、このプロパティを設定し、我々のクエリの結果は)(逆のことができます。

6つのカスタムフィールド(理解)

カスタムchar型のフィールド:

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):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=25)
    # 使用自定义的char类型的字段
    cname = FixedCharField(max_length=25)

ブログを参照してください:https://www.cnblogs.com/Dominic-Ji/p/9203990.html

おすすめ

転載: www.cnblogs.com/whkzm/p/11953600.html