阅读 63

Django-ContentType的使用

  • 一、神器ContentType

     如果 继续增加课程 价格策略表还得增加字段

     这样django自带一个contentType 帮助我们解决表之间的依赖关系:

    1.从settings文件可以看到原生就支持contenttype

      

    2.自动将创建的表名字 单独维护到content_type表

     3.contenttype实现的效果

    4.创建表结构models.py

    from django.contrib.contenttypes.models import ContentType
    from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
    class DegreeCourse(models.Model):
        """
        学位课表
        """
        name = models.CharField(max_length=32)
    
    
    class Course(models.Model):
        """
        课程表
        """
        name = models.CharField(max_length=32)
    
        # 数据库不生成,只用于链表查询
        policy_list = GenericRelation("PricePolicy")
    
    
    class PricePolicy(models.Model):
        """
        策略表
        """
        content_type = models.ForeignKey(ContentType,verbose_name="关联的表名称") #存表名的id
        object_id = models.PositiveIntegerField(verbose_name="关联表中数据行的id") 
    
        # 不在数据库中生成,只用于帮助你做数据操作
        content_object = GenericForeignKey('content_type', 'object_id')
    
        period = models.CharField(max_length=32)
        price = models.FloatField()

    5.写测试代码 做增加 删除操作

     views.py

    def testtype(request):    # 创建课程golang对应的三个价格列表
        obj = Course.objects.filter(name="golang").first() # 获取课程对象
        PricePolicy.objects.create(price=9.9,period=30,content_object=obj) # 通过contenttype创建
        obj1 = Course.objects.filter(name="golang").first()
        PricePolicy.objects.create(price=19.9,period=60,content_object=obj1)
        obj2 = Course.objects.filter(name="golang").first()
        PricePolicy.objects.create(price=29.9,period=90,content_object=obj2)    # 取golang课程对应的价格列表
        objs = Course.objects.filter(name="golang").first()
        price_policys = objs.policy_list.all()    print(price_policys)    return HttpResponse("...")

    PS:

        for priceplicy in price_list:        # 取出一个个的models对象 . content_obj 就可以去到相对应的
            print(priceplicy.content_obj.name,priceplicy.price, priceplicy.period)
    
        course_obj = Course.objects.get(id=1)
        obj = course_obj.policy_list.filter(id=3) # 和正常一样取值
        objs = course_obj.policy_list.all()

     6.返回的结果

  • 相关阅读:
    android灭屏后调用binder通讯竟然影响了socket的POLL_OUT事件,怪事。
    B0宏
    从surfaceflinger历史变更谈截屏
    arm下dlsym返回的符号地址居然不是偶对齐的。
    SIGCHLD waitpid, 小心子进程结束事件被偷了
    root权限后,不要忘了还有selinux
    shell命令管道未读完阻塞了子进程,与等待其结束的父进程死"锁"。
    我对BP网络的简单的理解
    python 中的字符串格式化
    阿里云深度学习采坑记

  • 原文地址:https://www.cnblogs.com/liujiliang/p/10008888.html


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐