• ContentType组件


    ContentType组件

    本文目录

    一 项目背景

    路飞学成项目,有课程,学位课(不同的课程字段不一样),价格策略

    问题,1 如何设计表结构,来表示这种规则
            2 为专题课,添加三个价格策略
              3 查询所有价格策略,并且显示对应的课程名称
              4 通过课程id,获取课程信息和价格策略

    二 版本一

    一个课程表,包含学位课和专题课,一个价格策略表,一对多关联

    三 版本二

    学位课表,专题课表,装逼课表,价格策略表(在价格策略课表中加入多个FK跟课程表做关联):后期再加其它课程,可维护性差

    四 最终版(使用ContentType)

    通过Django提供的ContentType表,来构建

    models层创建:

    复制代码
    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层:

    复制代码
    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')
    复制代码
  • 相关阅读:
    部署至Oracle数据库的注意事项
    当在centos上面部署项目时,mysql的一些驱动安装不上,
    drf利用redis做缓存是发生一点错误提示
    python字符串前面加个u代表什么
    在学习数据分析时,安装anaconda时遇到一点问题
    在使用scrapy框架爬取sina时,常见保存
    在linux上scrapyd部署scrapy项目时出现service_identity,并且不能识别其中的一个opentype模块
    如何在mysql增加一个和root权限一样的用户,安排
    mysq的root密码忘记,原来还有更优雅的解法
    mysql远程连接阿里云的Ubuntu服务器
  • 原文地址:https://www.cnblogs.com/di2wu/p/10161747.html
Copyright © 2020-2023  润新知