Django ContentType简单使用

ContentType:

咦~ 项目中遇到多种不同类型订单的情况,这个时候,给每种类型的订单创建一张表来专门存放订单信息不是不可以,但是,如果我们后面再有其它类型的订单出现,那么我还需要再创建一张表来存放这些订单,是不是很麻烦 ~
那怎么办呢?如何来处理这种一张表对应多张表的关联关系呢?
哈哈,其实呢Django已经替我们想到了,它内置的一个应用contenttypes就可以轻松处理这个问题 ,contenttypes可以追踪项目中所有app和model的对应关系,并记录在ContentType表中。
接下来我们就举个栗子 ^ o ^:
models.py

from django.contrib.contrnttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Order(models.Model):
    order_num = models.CharField(max_length=100)  # 订单号
    order_name = models.TextField()  # 订单名称
    total_amount = models.FloatField(null=False)  # 订单总额
    order_status = models.IntegerField(default=0)  # 订单状态  
    the_number = models.IntegerField(default=1)  # 商品数量
    created = models.DateTimeField(auto_now_add=True)  # 创建时间
    payment = models.CharField(max_length=20, null=True)  # 支付方式
    creator = models.ForeignKey(User)  # 用户

    content_type = models.ForeignKey(ContentType, blank=True, null=True, on_delete=models.DO_NOTHING)  # 代表哪个app下的哪张表
    object_id = models.PositiveIntegerField("绑定商品", blank=True, null=True)  # 具体哪张表下的对象id
    content_obj = GenericForeignKey('content_type', 'object_id')  # 不生成列,便于订单表的创建以及单个订单对应商品的查找

    class Meta:
        ordering = ('-created',)


class Course(models.Model):
    title = models.CharField(max_length=100)  # 课程名
    intro = models.TextField(null=True)  # 课程简介
    price = models.FloatField(default=0)  # 价格

    order = GenericRelation(Order)  # 忽略,用于GenericForeignKey反向查询,不会生成表字段,切勿删除


class Video(models.Model):
    title = models.CharField(max_length=100)  # 视频名
    intro = models.TextField(null=True)  # 视频简介
    price = models.FloatField(default=0)  # 价格

    order = GenericRelation(Order)  # 忽略,用于GenericForeignKey反向查询,不会生成表字段,切勿删除

以上,数据模型就建好了,接下来我们看一下如何添加数据:

# 创建一个课程订单,其中content_obj字段就锁定了这个订单具体对应的哪个模型中的哪条课程数据
course_1 = Courses.object.filter(title="python基础详解").first()
Order.objects.create(
                    order_num=111111,
                    order_name='python基础详解',
                    total_amount=12.00,
                    the_number=1,
                    order_status=0,
                    content_obj=course_1,
                )

创建数据成功之后一般情况下都是要进行查询的,如何查询这些数据呢?往下看:

# 根据课程示例找到该实例所有订单
course_2 = Course.object.get(id=1)
orders = course_2.order.all()


# 使用related_query_name
class Course(models.Model):
    title = models.CharField(max_length=100)  # 课程名
    intro = models.TextField(null=True)  # 课程简介
    price = models.FloatField(default=0)  # 价格

    order = GenericRelation(Order, related_query_name='courses')  

# 实现查询某个课程的所有订单:
Order.object.filter(courses__title='python基础详解')
# 实现查询python相关课程的所有订单
Order.object.filter(courses__title__contains='python')

参考:https://docs.djangoproject.com/en/1.11/ref/contrib/contenttypes/

注:以上代码只是简单介绍contenttypes的使用方法,不论是数据模型还是业务逻辑都是不完整的,故仅供参考,切忌照搬照抄!关于contenttypes的使用,本人并未完全了解或精通其精髓,所以以上理解中如有错误之处,还请各位网友不吝指出,在此感谢。

你可能感兴趣的:(django,contenttypes,django)