django - 总结 - contenttypes

我们得知没创建一张表都会在contenttpes里有一条记录

 

 

当一张表 需要动态的和多张表建立外键关系

如何创建?
利用contenttpes表,
表中数据id:指的是在具体的某一张表中的id记录
表        : contenttypes 中具体的某一张表所在记录的id

 

 

当创建好以后,如何更加方便的让我们去操作呢?

from django.db import models
from django.contrib.contenttypes.models import ContentType    # 关联的表

from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation# 方便我们去查询


class DegreeCourse(models.Model):
    """学位课程"""
    name = models.CharField(max_length=128, unique=True)
    course_img = models.CharField(max_length=255, verbose_name="缩略图")
    brief = models.TextField(verbose_name="学位课程简介", )


class Course(models.Model):
    """专题课程"""
    name = models.CharField(max_length=128, unique=True)
    course_img = models.CharField(max_length=255)

    # 不会在数据库生成列,只用于帮助你进行查询
    policy_list = GenericRelation("PricePolicy")


class PricePolicy(models.Model):
    """价格与有课程效期表""" # 关联course or degree_course
  # 绑定表
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # 绑定表里的 对象
  object_id
= models.PositiveIntegerField() price = models.FloatField()
  
  # 如果不写下面的,如果表存在,但是object_id不存在的话,这样也不会报错;但是明显不能这样,    因此下面这个字段不仅可以约束两者之间的关系,核能方便查询,(不用在通过contenttype表去找对应的应用和表)
    # 不会在数据库生成列,只用于帮助你进行添加和查询
    content_object = GenericForeignKey('content_type', 'object_id')

 

 

    # 添加
    models.PricePolicy.objects.create(
        price=9.9,
        content_object=models.Course.objects.get(id=1)
    )
    
    # course ------>price
    obj = models.Course.objects.get(id=1)
    for item in obj.policy_list.all():
        print(item.id, item.valid_period, item.price)

    # price-------->course
    price = models.PricePolicy.objects.get(id=2)

 

Contenttype表的实例对象可以 。metaclass获取对应的模型类

 

posted @ 2018-09-15 10:40  慕沁  阅读(119)  评论(0)    收藏  举报