• 05 django组件:contenttype


    1、django组件:contenttype

    组件的作用:可以通过两个字段让表和N张表创建FK关系

    1、专题课,学位课 如何关联 过期时间??

    方法1:分别创建 专题课--过期时间表 、学位课--过期时间表

    方法2:专题课,学位课对应到一张过期时间表

     方法3:过期时间表与 学位课,专业课,or 其他课程,创建外键关系

     

    2、models初始表结构

     

    $ python manage.py makemigrations
    $ python manage.py migrate

     

    3、contenttype表

     

     

     

    2、需求1:插入课程与过期时间

     1、方法1:ContentType

     

     

     2、方法2:GenericForeignKey

    models表结构

     不会生成数据库列

     

     view视图

     

     

    3、需求2 :根据价格策略查找对应的表和数据

    4、需求3:查询过期时间和价格

     

    5、contenttype组件的3件事

    1张表跟多张表,动态的创建FK关系

    2列实现多张表的FK

     其他应用:

      优惠券跟多张课程进行关联

      公共评论表,与多张表进行关联

    6、代码

    django组件:contenttype
    组件的作用:可以通过两个字段让表和N张表创建FK关系

     models

    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):
        """价格与课程有效期表"""
        content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)  # 关联course or degree_course
        object_id = models.PositiveIntegerField()
    
        # 不会在数据库生成列,只用于帮助你进行添加和查询
        content_obj = GenericForeignKey('content_type','object_id')
    
        valid_period_choices = (
            (1, '1天'),
            (3, '3天'),
            (7, '1周'),
            (14, '2周'),
            (30, '1个月'),
            (60, '2个月'),
            (90, '3个月'),
            (180, '6个月'),
            (360, '12个月'),
            (540, '18个月'),
            (720, '24个月'),
        )
        valid_period = models.SmallIntegerField(choices=valid_period_choices)
        price = models.FloatField()

    views

    from django.shortcuts import render, HttpResponse
    from django.contrib.contenttypes.models import ContentType
    from app01 import models
    
    
    def test(request):
        """价格策略表中增加,查询"""
        # 1.在价格策略表中添加一条数据
        # 方法1
        """
        models.PricePolicy.objects.create(
            valid_period=7,
            price=6.6,
            content_type=ContentType.objects.get(model='course'),
            object_id=1
        )
        """
    
        # 方法2
        """
        models.PricePolicy.objects.create(
            valid_period=14,
            price=9.9,
            content_obj=models.Course.objects.get(id=1)
        )
        """
    
        # 2.根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称
        '''
        price = models.PricePolicy.objects.get(id=2)
        print(price.content_obj.name)  # 自动帮你找到
        '''
    
        # 3、找到某个课程的所有价格策略
        obj = models.Course.objects.get(id=1)
        print(obj.policy_list.all())
    
        for item in obj.policy_list.all():
            print(item.id, item.valid_period, item.price)
    
        return HttpResponse('test...')
  • 相关阅读:
    ubuntu上搭建review board代码评审站点
    android5.1 for tq335x
    2015.04.11
    DECLARE_GLOBAL_DATA_PTR宏定义问题
    6410移植android4.4.2笔记(持续更新)
    ubuntu安装packet提示重复冲突问题
    android5.0 aosp编译记录(由于机器硬件原因,改为4.4.2编译通过)
    2015.01.16
    2015.01.14
    SDSM框架
  • 原文地址:https://www.cnblogs.com/venicid/p/11732676.html
Copyright © 2020-2023  润新知