記事のディレクトリ
モデルモデル
データモデル
フィールドタイプモデル
- CharFieldです(MAX_LENGTH =):文字列型、パラメータ長
- ブールフィールド():ブール
- DateField():date型、日付
- DateTimeField型():時間タイプ、年、月、日、時間
- auto_now_add:あなたは、最初の割り当てを作成する場合
- auto_now:毎回の変更の割り当て
- AutoField():インクリメントタイプ
- IntegerFieldと():整数型
- FloatField():フロート式
- FileFieldに():ファイルタイプ
- ImageField(upload_to =)ピクチャタイプ、ストレージ・パスは、パスパラメータであります
- これは、依存する
pillow
モジュール - セットアップ
MEDIA_ROOT
- これは、依存する
- TextFieldの():テキストタイプ
- DecimalFieldは():固定小数点精度
- max_digits:桁数の合計
- decimal_places:いくつかの小数点の後
MEEDIA_ROOT設けられた、例えばアイコンユーザアバターを格納する、settings.pyにそのパスに追加されます。
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/icons')
モデルで定義されたフィールドタイプとイメージファイルに限定されます。
class UserModel(models.Model):
username = models.CharField(max_length=32)
# upload_to=后面是根据时间生成的路径,在静态文件文件夹里面
icon = models.ImageField(upload_to="%Y-%M-%D")
もちろん、我々はできませんImageField()
、属性のストレージの場所をカスタマイズして、データベースへのパスを保存します
モデルパラメータ
- デフォルト:デフォルト値
- ナル:あなたは、値が空である、との情報を格納渡すレコードを作成することはできません、NULLで埋め
- 空白:空の文字列が空の文字列のフロントエンドを渡すことが許可されていないとき、空、チェック関連レコードがそうでない場合、作成することができますされ400
- PRIMARY_KEY:主キー、エネルギー自給のプロパティがあります
- ユニーク:一意制約は、複数のヌルが存在することができます
プロパティ
明示的な属性モデルとステルスのプロパティにデータを属性
支配的な性質モデル開発の自己宣言のプロパティとメソッドを含む、だけでなく、プロパティとメソッドに親クラスから継承されました。
隠し属性は、この宣言されていないの開発である、自動的に生成された属性は、開発者が自動的に生成されていないと宣言しました
たとえば、オブジェクトモデルは隠し属性である属性、開発者が宣言する必要はありません、自動的に生成され、直接クエリフィルタを呼び出して、マネージャーのインスタンスで、管理モデルを作成するために使用されます。
返された結果は、唯一の論理的な結果が削除されていない含まれるように、データベースのデータのろ過を達成するために、この例をオーバーライドします。まず、新しいクラスマネージャを作成し、彼の書き換えに、マネージャーから継承されたget_queryset()
フィルタリングを達成する方法を。
class LearnManager(Manager):
# 重写查询结果集,对数据进行过滤
def get_queryset(self):
queryset = super().get_queryset().filter(is_delete=Flase)
return queryset
def create_goods(self, g_name, g_price=10):
goods = self.model()
goods.g_name = g_name
goods.g_price = g_price
goods.save()
return goods
データの論理削除のために、あなたは、モデル属性に削除を定義する必要がありis_delete
、我々はモデルで定義し、この削除方法は、この属性は直接操作で削除します:
class Goods(model.Model):
is_delte = models.BooleanField(default=False)
def delete(self, using=None, keeo_parents=False):
self.is_delete = True
self.save()
# 重新定义objects为我盟的模型管理器的实例
goods_manager = LearnManager()
我々のモデルは、新しいモデルマネージャを有するようにgoods_manager
内Managerビューを使用します
# 查询所有没有被逻辑删除的数据
goods = Goods.goods_manager.all()
データの関係
1対多、1枚のみデータが外部キーによって達成することができるものに分割されたデータ、の間に規定される管理は、達成するために多くの外国のキーに限らず使用することができますペアの関係複数の次の2つのテーブル間でデータを表現するために、新しいテーブルを作成する必要があります
マンツーマン
使用シナリオ、事業分割、既存のテーブルを分割、または拡張プロジェクトで、フィールドを増やし、直接既存のテーブルを操作し、エラーが発生することがあり、損失が生じすることは、拡張テーブルを作成するために、当事者することはできません理想的です溶液は、例えば、外部キー、一意制約、追加する1つの関係で実現してもよいg_foo = models.ForeignKey(User, unique=True)
一対一のマッピング関係のためOneToOneFieldプロパティを来る、Djangoに。
データベースの操作は、メインテーブルの内容を削除すると、データテーブルがカスケードから削除され、テーブルから削除されたデータは、プライマリ・テーブルは影響を受けません。誰がテーブルからある1人の関係を、宣言しました
私たちは、ユーザ権限テーブルVipModel、ユーザテーブルがメインテーブルで、二つのテーブル、ユーザテーブルUserModelがあることを前提とし、テーブルがテーブルからの許可です。声明関係声明v_user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True)
。SET_NULLは空にすることができます。
プロパティ内の一つ:メインテーブル、テーブルから値が不可視属性で取得モデル名を使用して取得、およびユーザ権限の表に従って、表の最後のユーザデータを取得します
user = UserModel.objects.last()
# 对象.关联模型(模型名要小写)获取到一条vip数据
vip = user.vipmodel
テーブルから取得したマスタテーブルの情報が支配的な特性である、取得したフィールド名を直接することができます。あなたが最初のVIPユーザー名を取得したい場合は、許可テーブルで、フィールドのユーザーテーブルを取得
vip = VipModel.objects.first()
# 对象.字段(字段是vip表中的,获取到用户对象)
user = vip.v_user
多くの
関係多ワンと基本的に同じである、達成するためのForeignKeyを使用して、デフォルトのマスタデータテーブルを削除するには、テーブルの連結から削除されます、あなたは保護モードを設定することができ、それは削除されません。SET_PROTECT
私たちは、人のテーブルがあるとし、趣味テーブル、人々のテーブルがメインテーブルで、モデル定義
# 人
class Person(models.Model):
p_name = models.CharField(max_length=30)
p_age = models.IntegerField(default=1)
# 爱好
class Hobby(models.Model):
h_name = models.CharField(max_length=30)
h_cost = models.FloatField(default=1000)
# 一对多
h_person = models.ForeignKey(Person, on_delete=models.PROTECT)
連結を取得し、Djangoは自動的にテーブルを生成模型_set
を通してそれを取得するために、テーブルからデータを取得し、マネージャ
# 从获取主,显性属性, 对象.字段名
hobby = Hobby.objects.last()
person = hobby.h_person # 爱好对应的人
# 主获取从,隐性属性, 对象.关联模型_set [与objects同源,所以用法也是一致]
person = Person.objects.last()
# hobby_set与objects同源,all表示所有数据
hobbies = person.hobby_set.all() # 人对应的爱好
# 按条件获取
hobbies = person.hobby_set.filter(id=2)
多くの多くの
明らかには、2つのデータテーブル間のマッピングは、第三のテーブルを反映するようでありManyToManyField
、達成するために、Djangoは自動的に2つのテーブル、同じリレーショナルテーブル関連IDに格納される第3のテーブル表を作成しますそして、テーブルからテーブルからテーブルからの声明は、人間の介入を必要としません。
あなたはデータを削除すると、自動的にカスケードリレーショナルデータリレーショナル表を削除します
ユーザーと商品の間に私たちの関係は、取得カスケードデータを表示します
class UserModel(models.Model):
u_name = models.CharField(max_length=32)
class Goods(models.Model):
g_name = models.CharField(max_length=64)
g_users = models.ManyToManyField(UserModel)
データが複雑なクエリされたときに取得した動作データ、:
# 数据查询
# 从表获取主表,是显性属性:对象.字段名
goods = Goods.object.last()
user = goods.g_user.all()
# 主表获取从表,是隐形属性:对象.从表_set
user = UserModel.objects.first()
goods = user.Goods_set.all()
# 数据改动
goods = Goods.objects.first()
user = UserModel.objects.last()
user.goods_set.add(goods) # goods_set是自动生成的模型管理器
goods.g_user.remove(user)
goods.g_user.clear() # 清楚所有关系数据
モードを削除します
カスケード関係の属性フィールドの宣言「= xxxのon_delete」増加は、以下の値が含まれ
、たとえば、書かれたが、(プロパティon_deleteない多くの関係)
v_user = models.OneToOneField(UserModel, on_deletr=models.SET_NULL, null=True)
- models.CASECADE:デフォルトのモードは、デフォルトのカスケードは、データを削除します
- models.DO_NOTHING:何もしない、関連付けられたデータを削除
- models.PROTECT:プロテクトモード、データのカスケードがある場合に、消去異常が報告されます
- models.SET_XXX
- SET_NULL:マスター表の連結が削除されたときに(ヌル許可を指定する)、ブランク
- SET_DEFAULT:マスター表の連結削除されたデフォルト値(指定されたデフォルト値)
- SETは、():削除された立体オブジェクト要素にリダイレクト
- (値)SET:指定に関連付けられた値のデータを削除します
- SET(実行可能なオブジェクト):関連する実行可能なオブジェクトの値を戻り値に設定されています
モデルの継承
私たちが作成したモデルのモデルは、それ自体がmodels.Modelから継承され、同様に、我々はまた、親、親クラスに保存されている一般的なデータモデルのベースとして独自のモデルを定義することができます。
直接移行した場合、直接の親テーブルを作成するデータベースは、属性は、モデルに基づいて定義することができるclass Meta:
抽象基本的なモデルに、。
class BaseModel(models.Model):
id = models.IntegerField(primary_key=True, unique=True, autoincrement=True)
class Meta:
abstract = True
抽象プロパティを定義した後、ベースモデルは、マッピングデータベースを生成しません
モデルとライブラリの変換
モデル - >デシベル
移行モデル生成されたデータテーブル
デシベル - >モデル
モデルファイルへのマッピング・データ・テーブル
python manage.py insectdb > models.py
環境交通:
- すべてが依存エクスポート
pip freeze > requirements.txt
- そして、任意の依存関係をインストール
pip install -r requirements.txt