contenttypesのDjangoは内蔵のアプリケーションであり、モデルとアプリケーション間のすべての通信は、プロジェクトを追跡し、ContentTypeをテーブルに記録することができます。
書込ファイルテーブル構造models.py、データ移行コマンド二makemigrationsを通って移動した後、たdjango_content_typeは自動的にデータベース内のテーブルを生成します。
我々は新しいモデルを作成した後、データベースの移行を実行するたびに、ContentTypeをテーブルには、自動的にレコードを追加します。パス:例えば、私はでmodels.pyのテーブルクラスエレクトリック(models.Model)APIアプリケーションを作成します。以下に示すデータベースからビューContentTypeをテーブル、:
ContentTypeをGenericRelation GenericForeignKey例
#!は/ usr / binに/のpython3 # - * - コーディング:UTF-8 - * - #__author__ = '__Jack__' __future__インポートunicode_literalsから 輸入UUID コレクションからカウンターをインポート django.confインポート設定から django.contrib.contenttypes.modelsインポートたContentTypeから django.contrib.contenttypes.fieldsからGenericRelation、GenericForeignKeyをインポート django.db輸入モデルから slugify輸入slugifyから markdownx.modelsからMarkdownxFieldをインポート taggit.managersインポートTaggableManagerから markdownx.utilsからmarkdownifyをインポート クラス投票(models.Model): ContentTypeを中「」「使用ジャンゴ、関連するユーザーが質問と回答に投票しながら、 投票 「」」 uuid_id = models.UUIDField(PRIMARY_KEY = Trueの場合、デフォルト= uuid.uuid4、偽=編集可能) ユーザー= models.ForeignKey(settings.AUTH_USER_MODEL、related_name = 'qa_vote' on_delete = models.CASCADE、verbose_name = '用户') 値= models.BooleanField(デフォルト=真、verbose_name =「のかに対する」)#真推奨するもので、偽反対 #GenericForeignKey設定 CONTENT_TYPE = models.ForeignKey(ContentTypeを、related_name = 'votes_on'、on_delete = models.CASCADE) OBJECT_ID = models.CharField(MAX_LENGTH = 255) 投票= GenericForeignKey( 'CONTENT_TYPE'、 'OBJECT_ID')#)が(GenericForeignKeyと同等です created_at = models.DateTimeField(auto_now_add =真、verbose_name = '创建时间') updated_atの= models.DateTimeField(auto_now =真、verbose_name = '更新时间') クラスメタ: verbose_name = '投票' verbose_name_plural = verbose_name unique_together =( 'ユーザー'、 'CONTENT_TYPE'、 'OBJECT_ID')#アメリカ一意のキー #SQLの最適化 index_together =( 'CONTENT_TYPE'、 'OBJECT_ID')#アメリカ一意のインデックス クラスQuestionQuerySet(models.query.QuerySet): 「」「カスタムクエリセットは、モデルクラスの可用性を高めます。」「」 デフ(自己)get_answered: 「」「」「私は質問への答えを持っています」 リターンself.filter(has_answer =真)は、( 'ユーザー').select_related デフ(自己)get_unanswered: 「」「」「質問への答えではありません」 リターンself.filter(has_answer = Falseが)( 'ユーザー').select_related デフget_counted_tags(自己): 「」「すべての問題の統計タグの数(0より大きい)」「」 tag_dict = {} self.allでOBJのための(): obj.tags.namesでのタグの(): タグではないtag_dictであれば: tag_dict [タグ] = 1 他: tag_dict [タグ] + = 1 tag_dict.itemsを返します() クラス質問(models.Model): 「」「問題は」「」 STATUS =(( "O"、 "開く")、( "C"、 "閉じる")、( "D"、 "ドラフト")) ユーザー= models.ForeignKey(settings.AUTH_USER_MODEL、related_name = "q_author"、 on_delete = models.CASCADE、verbose_name = '提问者'、デフォルト= 1) タイトル= models.CharField(max_lengthを= 255、ユニーク=真、verbose_name = '标题') スラグ= models.SlugField(max_lengthを= 80、ヌル= Trueの場合、空白=真、verbose_name = '(URL)别名') ステータス= models.CharField(max_lengthを= 1、選択肢= STATUS、デフォルト= 'O'、 verbose_name = '問題のある状態') コンテンツ= MarkdownxField(verbose_name = '内容') タグ= TaggableManager(help_textに= '離間し、(英語)を使用する複数のタグ'、verbose_name = 'タグ') has_answer = models.BooleanField(デフォルト= Falseを、verbose_name = "答えを受け入れる")許容可能な答えがある場合は#を 投票= GenericRelation GenericRelationテーブルで#投票に関連した(投票、verbose_name =「投票」)ではなく、実際のフィールド created_at = models.DateTimeField(db_index =真、auto_now_add =真、verbose_name = '创建时间') updated_atの= models.DateTimeField(auto_now =真、verbose_name = '更新时间') オブジェクト= QuestionQuerySet.as_manager() クラスメタ: verbose_name = '問題' verbose_name_plural = verbose_name 発注=( "-created_at"、) デフ(自己、* argsを、** kwargsから)を保存します。 self.slugない場合: self.slug = slugify(self.title) スーパー(質問、自己).SAVE(* argsを、** kwargsから) デフ__str __(自己): リターンself.title デフget_markdown(自己): markdownifyを返す(self.content) デフtotal_votes(自己): "" "得票数" "" DIC =カウンター(self.votes.values_list( '値'、フラット=真))どのように票、少数派に対する#カウンター リターンDIC [TRUE] - DIC [偽] デフget_answers(自己): 「」「すべての答えを取得します。」「」 どのように多くのAnswer.objects.filter(質問=自己).select_related(「ユーザー」、「質問」)パラメータとして#自己、現在の答え質問を返します デフcount_answers(自己): 「」「」「答えは、数あります」 self.get_answers()を返す。カウント() デフget_upvoters(自己): 「」「ユーザーが承認しました。」「」 [self.votes.filterで投票vote.user(値=真)は( 'ユーザー')を.select_related。prefetch_related( '投票')]を返します デフget_downvoters(自己): 「」「」「ユーザーに対する」 [self.votes.filter(値=偽)での投票のためのvote.userは( 'ユーザー')を.select_related。( '投票')prefetch_related]を返します クラスの回答(models.Model): 「」「回答」「」 uuid_id = models.UUIDField(PRIMARY_KEY = Trueの場合、デフォルト= uuid.uuid4、偽=編集可能) ユーザー= models.ForeignKey(settings.AUTH_USER_MODEL、related_name = 'a_author'、on_delete = models.CASCADE、 verbose_name = '回答') 質問= models.ForeignKey(質問、on_delete = models.CASCADE、verbose_name = '问题') コンテンツ= MarkdownxField(verbose_name = '内容') is_answer = models.BooleanField(デフォルト= Falseを、verbose_name = '答えが受け入れられます') 票= GenericRelation(投票、verbose_name = '投票') created_at = models.DateTimeField(db_index =真、auto_now_add =真、verbose_name = '创建时间') updated_atの= models.DateTimeField(auto_now =真、verbose_name = '更新时间') クラスメタ: 発注=( '-is_answer'、 '-created_at')#複数フィールドの順序 verbose_name = '答え' verbose_name_plural = verbose_name デフ__str __(自己): リターンself.content デフget_markdown(自己): markdownifyを返す(self.content) デフtotal_votes(自己): "" "得票数" "" DIC =カウンター(self.votes.values_list( '値'、フラット=真))どのように票、少数派に対する#カウンター リターンDIC [TRUE] - DIC [偽] デフget_upvoters(自己): 「」「ユーザーが承認しました。」「」 [self.votes.filterで投票vote.user(値=真)は( 'ユーザー')を.select_related。prefetch_related( '投票')]を返します デフget_downvoters(自己): 「」「」「ユーザーに対する」 [self.votes.filter(値=偽)での投票のためのvote.userは( 'ユーザー')を.select_related。( '投票')prefetch_related]を返します デフaccept_answer(自己): 「」「」「答えを受け入れます」 質問は複数回答がある場合#は、他には何の返事を受け取っていない答え、唯一の採用がに設定されなければなりません answer_set = Answer.objects.filter(質問= self.question)#すべての答えの最新号をチェック answer_set.update(is_answer =偽)#は受け入れないように設定されなければなりません #現在の答えを受け入れて保存 self.is_answer =真 self.save() 問題は答えを受け入れてきた#、保存 self.question.has_answer =真 self.question.save() QuerySetModelで書かれたクエリを返すために必要なロジックの#1セット モデルに書き込むための#2の論理モデルクラスのデータベース処理 ビューで書かれた#3ビジネス関連の処理ロジック