Django 之ContentType

1、介绍

   ContentType 解决问题:一个表的两个字段与另外两个(或两个以上)的表有关联
# Course表  免费课
# id         name     
   1      Linux入门                   
   2      Python入门                      


# DegreeCourse表  学位课
# id         name        
   1      Python全栈              


# PricePolicy表 其中的两个字段分别对应上述表的id和表名
# id        day        price        couse_id        course_type
   1        7            0                1            免费课
   2        7            0                2            免费课
   3        14           9.9              2            免费课
   4        180          18888            1            学位课   

   修改PricePolicy表,和django的content_type相关联,conten_type保存的书django所有的表名

# PricePolicy表
# id         day         price        couse_id    course_type(外键)
   1        7            0                1            1
   2        14           9.9              1            1
   3        180          18888            1            2  


# ContentType表
id         midel            app_lable
1          course            app01
2          degreecourse      app01  

2、自定义方法操作

  模型表

from django.db import models

class Course(models.Model):
    name = models.CharField(max_length=32)
    def __str__(self):
        return self.name

class DegreeCourse(models.Model):
    name = models.CharField(max_length=32)
    def __str__(self):
        return self.name
# 使用了ContentType表但是没有用它的方法
from django.contrib.contenttypes.models import ContentType
class PricePolicy(models.Model):
    day = models.IntegerField()
    price = models.CharField(max_length=8)
    course_id = models.IntegerField()  
    content_type = models.ForeignKey(to=ContentType, null=True)  # 一会要改成外键
    # 自定义操作

   # 1. 给course中的数据插入一条策略,使用_meta.model_name 来获取表名字符串
# 方法:先查课程;通过课程查得到表名;在策略表中插入数据 course = models.DegreeCourse.objects.first() contenttype = models.ContentType.objects.filter(model=course._meta.model_name).first() models.PricePolicy.objects.create(day=7, price=0, course_id=course.id, content_type=contenttype) # 2. 通过课程查策略, # 方法:同上 course = models.DegreeCourse.objects.first() contenttype = models.ContentType.objects.filter(model=course._meta.model_name).first() price_policy = models.PricePolicy.objects.filter(course_id=course.id, content_type=contenttype).values('day', 'price') print(price_policy) # 通过策略查找课程,使用apps.get_model来获取表的类 # 方法:先查策略表;通过get_model得到表类;然后在课程表内查数据 from django.apps import apps price_policy_obj = models.PricePolicy.objects.filter(day=7, price=0).first() model = apps.get_model('API', price_policy_obj.content_type.model) # 第一个参数是应用名,第二个参数是表名,得到是表的类 course = model.objects.filter(pk=price_policy_obj.course_id) print(course)

3、使用ContentType方法操作

   模型表

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericRelation
from django.contrib.contenttypes.fields import GenericForeignKey


class Course(models.Model):
    name = models.CharField(max_length=32)
    price_policy = GenericRelation(to='PricePolicy')
    def __str__(self):
        return self.name


class DegreeCourse(models.Model):
    name = models.CharField(max_length=32)
    price_policy = GenericRelation(to='PricePolicy')
    def __str__(self):
        return self.name


class PricePolicy(models.Model):
    day = models.IntegerField()
    price = models.CharField(max_length=8)
    object_id = models.IntegerField()
    content_type = models.ForeignKey(to=ContentType, null=True)
    model_obj = GenericForeignKey()

# 注意:
#     1. 这里的model_obj指的就是DegreeCourse 或 Course表对象
#     2. object_id 指的是课程的id,是为了和GenericForeignKey内的参数相对应
#     3. 若要自定义object_id和coutent_type,则GenericForeignKey和GenericRelation内的参数也要修改,如:
#         course_id = models.IntegerField()  
#         course_type = models.ForeignKey(to=ContentType, null=True)
#         model_obj = GenericForeignKey(ct_field='course_type', fk_field='course_id')
#
#         price_policy = GenericRelation(to='PricePolicy', object_id_field='course_id', content_type_field='course_type')
# 1. 给course中的数据插入一条策略
degree_course = models.DegreeCourse.objects.first()
models.PricePolicy.objects.create(day=180, price=18880, model_obj=degree_course)


# 2. 查找所有课程的所有价格策略
price_policy_list = models.PricePolicy.objects.all()
for price_policy in price_policy_list:
    print(price_policy.model_obj.name, price_policy.day, price_policy.price)


# 3. 通过课程查策略,
course = models.Course.objects.first()
price_policys = course.price_policy.all()
for price_policy in price_policys:
    print(course.name, price_policy.day, price_policy.price)

 

 

posted @ 2019-05-25 20:56  yw_sun  阅读(188)  评论(0)    收藏  举报