ジャンゴ之ContentTypeを、GenericRelation、GenericForeignKey

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 =( 'ユーザー'、 'C​​ONTENT_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ビジネス関連の処理ロジック

  

 

おすすめ

転載: www.cnblogs.com/yoyo1216/p/11685072.html