ContentType組件

一 項目背景

路飛學成項目,有課程,學位課(不一樣的課程字段不同),價格策略數據庫

問題,1 如何設計表結構,來表示這種規則
        2 爲專題課,添加三個價格策略
          3 查詢全部價格策略,而且顯示對應的課程名稱
          4 經過課程id,獲取課程信息和價格策略django

二 版本一

一個課程表,包含學位課和專題課,一個價格策略表,一對多關聯json

三 版本二

學位課表,專題課表,裝逼課表,價格策略表(在價格策略課表中加入多個FK跟課程表作關聯):後期再加其它課程,可維護性差app

四 最終版(使用ContentType)

經過Django提供的ContentType表,來構建post

 

models層建立:this

複製代碼
from django.db import models

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation


class Course(models.Model):
    title = models.CharField(max_length=32)
    # 不會在數據庫中生成字段,只用於數據庫操做
    # policy = GenericRelation('PricePolicy',object_id_field='object_id',content_type_field='contentType')


class DegreeCourse(models.Model):
    title = models.CharField(max_length=32)


class PricePolicy(models.Model):
    # 跟ContentType表作外鍵關聯
    contentType = models.ForeignKey(to=ContentType)
    # 正數
    object_id = models.PositiveIntegerField()

    # 引入一個字段,不會在數據庫中建立,只用來作數據庫操做
    # content_obj = GenericForeignKey('contentType', 'object_id')

    period = models.CharField(max_length=32)
    price = models.FloatField()
複製代碼

 views層:spa

複製代碼
from app01 import models
def test(request):
    import json
    # 方式一插入價格規則
    # ret=models.ContentType.objects.filter(model='course').first()
    # course=models.Course.objects.filter(pk=1).first()
    # print(ret.id)
    # models.PricePolicy.objects.create(period='30',price=100,object_id=course.id,contentType_id=ret.id)

    # 方式二插入價格規則
    # course=models.Course.objects.filter(pk=1).first()
    # # content_obj=course  會自動的把課程id放到object_id上,而且去ContentType表中查詢課程表的id,放到contentType上
    # models.PricePolicy.objects.create(period='60',price=800,content_obj=course)
    # 增長學位課,價格規則
    # degreecourse = models.DegreeCourse.objects.filter(pk=1).first()
    # models.PricePolicy.objects.create(period='60', price=800, content_obj=degreecourse)

    # 查詢全部價格策略,而且顯示對應的課程名稱
    # ret=models.PricePolicy.objects.all()
    # for i in ret:
    #     print(i.price)
    #     print(i.period)
    #     # content_obj 就是代指關聯的課程,或者學位課程的那個對象
    #     print(type(i.content_obj))
    #     print(i.content_obj.title)

    # 經過課程id,獲取課程信息和價格策略
    course=models.Course.objects.filter(pk=1).first()
    print(course.policy.all())




    return render(request,'test.html')
複製代碼
相關文章
相關標籤/搜索