Django-ContentType

背景:学位课、专题课、价格策略(每一种课程(学位课和专题课下可分为不同的种类的课程)在不同学习时间内的价格不同)

例如:如何将课程表与价格策略表关联起来:

用外键是可以将课程表和价格策略表关联起来的,但是在后面对表数据的操作起来会非常的复杂,所以我们可以使用Django的ContentType组件来完成:

model.py

class Course(models.Model):
    name=models.CharField(max_length=32,verbose_name="专题课程")

class DegreeCourse(models.Model):
    name=models.CharField(max_length=32,verbose_name="学位课程")

class PricePolicy(models.Model):

    period=models.CharField(max_length=32,verbose_name="周期")
    price=models.FloatField(verbose_name="价格")

得到表:

django_content_type表(可以用次表与价格策略表关联)

model.py  加入次字段即可关联PricePolicy表


from django.contrib.contenttypes.models import ContentType

class
Course(models.Model): name=models.CharField(max_length=32,verbose_name="专题课程") class DegreeCourse(models.Model): name=models.CharField(max_length=32,verbose_name="学位课程") class PricePolicy(models.Model): content_type=models.ForeignKey(ContentType) object_id=models.PositiveSmallIntegerField() period=models.CharField(max_length=32,verbose_name="周期") price=models.FloatField(verbose_name="价格")
PricePolicy表

关于链表查询

model.py

class Course(models.Model):
    name=models.CharField(max_length=32,verbose_name="专题课程")

class DegreeCourse(models.Model):
    name=models.CharField(max_length=32,verbose_name="学位课程")
    # 数据库不生成,只用于链表查询
    policy_list = GenericRelation("PricePolicy")

class PricePolicy(models.Model):
    content_type=models.ForeignKey(ContentType)
    object_id=models.PositiveSmallIntegerField(verbose_name="正整数")

    # 不在数据库中生成,只用于帮助你做数据操作
    content_object=GenericForeignKey("content_type","object_id")

    period=models.CharField(max_length=32,verbose_name="周期")
    price=models.FloatField(verbose_name="价格")

views.py

from .models import *
def index(request):
    # 为专题课1添加2个价格策略
    # course=Course.objects.get(id=1)
    # PricePolicy.objects.create(period=10,price="19.2",content_object=course)
    # PricePolicy.objects.create(period=20,price="119.2",content_object=course)

    # 显示所有的价格策略,并将其对应的课程名称显示。
    # price_list=PricePolicy.objects.all()
    # for obj in price_list:
    #     print(obj.content_object.id,obj.period,("天"),obj.content_object.name)
        #1 10 天 7天python入门
        # 1 10 天 7天python入门
        # 1 20 天 7天python入门
        # 2 10 天 21天python放弃
        # 2 20 天 21天python放弃


    # 给你课程ID,获取课程信息+该课程的所有价格策略
    course_obj = Course.objects.get(id=2)
    print(course_obj.id)
    print(course_obj.name)
    policy_list = course_obj.policy_list.all()
    for item in policy_list:
        print(item.price, item.period)
    return HttpResponse("ok")
 
原文地址:https://www.cnblogs.com/caochao-/p/8810445.html