基本コンセプト
基本表:抽象的な形は、それ自体が、公共の場を提供するために、継承にないように設計されていない、完全なデータベースの移行
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
created_time = models.DateTimeField(auto_now_add=True)
class Meta:
# 基表,为抽象表,是专门用来和继承,提供公有字段,自身不会完成数据库迁移
abstract = True
テーブルの対応関係オフ
- それも、テーブル、クエリ、業務効率に影響することはありません
- でもテーブルCRUD業務効率が向上します
- 後半データベース・テーブルを再構築するのは簡単
- データベース自体もテーブルが検出されないという欠点が容易ダーティデータが存在し、必要なパラメータは、厳密な論理によって汚いを避けるために
- 従属B、最初の挿入の記録は、米国Bに対応するレコードの記録が関連するケースの非存在下で産生され、動作を実現することができるが、データがダーティであるデータBを添加し、次いで、ダーティデータが処理されます。最初のターン動作B手順A後、満たす複数の論理的思考、同様に行うことができます。でも、テーブルルックアップテーブルABになるロジックによって、任意の例外がありません。
テーブルのリレーションシップを確立します
- ブックのテーブルとテーブルが公開され、多くのマルチパーティ帳の外部キー
- そして、多くの書籍の著者:高周波のいずれかで、外部キーがブックを照会します
- 著者とAuthorDetail 1:AuthorDetailの実際のニーズに応じて正しい位置に外部キーを確立すること
class Book(BaseModel):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits=10, decimal_places=2)
publish = models.ForeignKey(to='Publish', related_name='books', db_constraint=False, on_delete=models.DO_NOTHING, null=True)
authors = models.ManyToManyField(to='Author', related_name='books', db_constraint=False)
def __str__(self):
return self.name
class Publish(BaseModel):
name = models.CharField(max_length=64)
address = models.CharField(max_length=64)
class Author(BaseModel):
name = models.CharField(max_length=64)
class AuthorDetail(BaseModel):
phone = models.CharField(max_length=64)
author = models.OneToOneField(to=Author, related_name='detail', on_delete=models.CASCADE, db_constraint=False)
外部キーフィールド属性
- 逆引き参照に外部キーフィールド名に外部キーをRelated_name:フォワード検索フィールド名、逆related_nameをチェック
- on_delete外部キーは、システムがデフォルト(値models.CASCADE)を提供し、Djangoの2.xは、手動で明確にする必要があり、Djangoの1.1で、カスケードに示すために提供されなければなりません
- CASCADE:デフォルト値、カスケード
- DO_NOTHING:外部キーが連結されていない、それは、任意の処理を行わず、表A、表Bに依存する、レコード削除B、表Aの外部キーフィールドに想定されます
- SET_DEFAULT:デフォルトの属性設定の値と仮定、表B表A、Bのレコードの削除依存表Aの外部キーフィールド、デフォルト属性が一緒に使用する必要があります
- SET_NULL:と仮定依存表B表Aは、Bのレコードの削除は、表Aの外部キーフィールドの値がnull、nullで= Trueの場合、使用特性に使用する必要があります
- あなたはカスケード関係に対処したい場合On_delete、多くのフィールドは、デフォルトのカスケード、カスケードに設定することができない、あなたは、テーブルには、複数の外部キーを処理し、手動でテーブル間のリレーションシップをクリアする必要があります
- コントロールに関連付けられた外部キーテーブルをdb_constraint、提供Falseを表す解離、関連するデフォルトがTrueであることを示しています
##の配列:
- これは、直列化だけを使用することができます
- フィールド名は、外部キーフィールドでなければなりません
- カスタムシーケンスアウトサイダーキーフィールドに関しては、カスタム直列フィールドは抗シリアライズに関与していない、と私たちはストレージに置くことができないので、子供は、外部キー名を直列化されなければなりません
- 外部キー関連のデータは、明確にする必要が冗長です
many=True
- 一方向動作のシーケンス、サブシーケンスの種類が先頭に書き込まなければならないように、それが配列の逆方向を生成することができないため
from rest_framework import serializers
from . import models
class BookModelSerializers(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
class PublishModelSerializers(serializers.ModelSerializer):
books = BookModelSerializers(many=True)
class Meta:
model = models.Publish
# fields = '__all__'
fields = ['name', 'address', 'books']