Django-ContentType的使用

Posted liujiliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.返回的结果

技术分享图片

 

以上是关于Django-ContentType的使用的主要内容,如果未能解决你的问题,请参考以下文章

webstorm代码片段的创建

使用 Git 来管理 Xcode 中的代码片段

Android课程---Android Studio使用小技巧:提取方法代码片段

VIM 代码片段插件 ultisnips 使用教程

使用 Pygments 检测代码片段的编程语言

创建自己的代码片段(CodeSnippet)