django---django_content_type内置表

models

from django.db import models

# Create your models here.

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)
    object_id = models.PositiveIntegerField()

    # 不在数据库中生成,只用于帮助你做数据操作
    content_object = GenericForeignKey('content_type', 'object_id')

    period = models.CharField(max_length=32)
    price = models.FloatField()

我们在makemigrations迁移数据库时,django会自动生成django_content_type表,该表将我们创建的app下的models表进行app_label-models一一映射

django---django_content_type内置表_第1张图片

看下我们迁移数据库生成的CourseDegreeCoursePricePolicy

django---django_content_type内置表_第2张图片

app_course

1   基础

app_degreecourse

1   进阶

content_type_id是我们的django_content_type表对应的某个app下的某个modelid
object_id是价格策略表关联的content_type_id关联的那个model表中的某条记录id值
content_object不在数据库中生成,只用于帮助你做数据操作

来看下测试如下:

from django.shortcuts import render,HttpResponse

# Create your views here.
from  . import models

def index(request):
    # course_obj = models.Course.objects.get(id=1)
    # models.PricePolicy.objects.create(period='10', price=9.9, content_object=course_obj)
    # models.PricePolicy.objects.create(period='20', price=19.9, content_object=course_obj)
    # models.PricePolicy.objects.create(period='30', price=29.9, content_object=course_obj)

    # degree_course_obj = models.DegreeCourse.objects.get(id=1)
    # models.PricePolicy.objects.create(period='8', price=9.9, content_object=degree_course_obj)
    # models.PricePolicy.objects.create(period='16', price=19.9, content_object=degree_course_obj)
    # models.PricePolicy.objects.create(period='99', price=29.9, content_object=degree_course_obj)


    print("显示所有的价格策略,并将其对应的课程名称显示。")
    # policy_list = models.PricePolicy.objects.all()
    # for obj in policy_list:
    #     print(obj.period,obj.price,obj.content_object,obj.content_object.id,obj.content_object.name)


    print("给你课程ID,获取课程信息+该课程的所有价格策略")
    course_obj = models.Course.objects.get(id=1)
    policy_list = course_obj.policy_list.all()
    for item in policy_list:
        print(item.price, item.period)


    return  HttpResponse("...")
显示所有的价格策略,并将其对应的课程名称显示。
10 9.9 Course object 1 基础
20 19.9 Course object 1 基础
30 29.9 Course object 1 基础
8 9.9 DegreeCourse object 1 进阶
16 19.9 DegreeCourse object 1 进阶
99 29.9 DegreeCourse object 1 进阶
给你课程ID,获取课程信息+该课程的所有价格策略
[12/Apr/2018 16:55:42] "GET /index/ HTTP/1.1" 200 3
9.9 10
19.9 20
29.9 30

你可能感兴趣的:(PythonWeb框架)