Django ContentType组件

本文深入探讨了Django框架中的ContentTypes应用,解释了其如何追踪项目中所有app和model的对应关系,以及在多对一关系场景下的具体实现方式。通过实例演示了如何使用ContentTypes来关联不同类型的课程与价格策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、作用

概念: contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中

二、应用场景

 

一张多对一的表,与多张表有对应关系(多对一)

可以通过,给多对一的表添加字段来完成,没有用到的值用空值表示,但这种操作太过于麻烦

思想:

通过创建一张额外的表用于存储表名,

多对一的表

id   ....     xid(单表的id)   oid(额外的表的id)

1               1                     1

2                     2                    1

举例:

-不同种类的课程对应不同的表
-每一类课程,每一个课程,对应多种价格

三、知识点

1、导入模块

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
# Create your models here.

2、在多对一的表中创建三个字段

    # content_type 和 object_id 以及 content_object 的名称是固定的
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    # PositiveIntegerField 正整数
    object_id = models.PositiveIntegerField()

    # 不会在数据库中生成字段, 只用于查询和添加
    content_object = GenericForeignKey('content_type', 'object_id')

3、在一的表中添加

  # policy_list不会在数据库生成,只用于查询
    policy_list = GenericRelation(to="PricePolicy")

4、3个过程

a、在django_content_type中添加表的数据

b、多对一的表与一表产生联系

c、一的表与多对一的表产生联系

四、示例

1、models.py

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
# Create your models here.


class Course(models.Model):
    name = models.CharField(max_length=32, unique=True)
    img = models.CharField(max_length=255)

    # 不会在数据库中产生字段,只用于查询
    policy_list = GenericRelation(to="PricePolicy")

    def __str__(self):
        return self.name


class DegreeCourse(models.Model):
    name = models.CharField(max_length=32, unique=True)
    img = models.CharField(max_length=255)

    # policy_list不会在数据库生成,只用于查询
    policy_list = GenericRelation(to="PricePolicy")

    def __str__(self):
        return self.name


class PricePolicy(models.Model):
    # content_type 和 object_id 以及 content_object 的名称是固定的
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    # PositiveIntegerField 正整数
    object_id = models.PositiveIntegerField()

    # 不会在数据库中生成字段, 只用于查询和添加
    content_object = GenericForeignKey('content_type', 'object_id')

    valid_period_choices = (
        (1, '1天'),
        (3, '3天'),
        (7, '1周'), (14, '2周'),
        (30, '1个月'),
        (60, '2个月'),
        (90, '3个月'),
        (180, '6个月'), (210, '12个月'),
        (540, '18个月'), (720, '24个月'),
    )
    valid_period = models.SmallIntegerField(choices=valid_period_choices)
    price = models.FloatField()

2、views.py

from django.shortcuts import render, HttpResponse
from app01.models import Course, DegreeCourse, PricePolicy
# Create your views here.


def test(request):
    # 1.添加数据: 先PricePolicy表中, 添加一条数据
    # PricePolicy.objects.create(
    #     valid_period=7,
    #     price=88.22,
    #     content_object=Course.objects.get(id=1)
    # )
    # # 2.正向查找: 从PricePolicy表中, 查找对应表的数据
    # price_obj = PricePolicy.objects.get(id=1)
    # course_name = price_obj.content_object.name
    # course_img = price_obj.content_object.img
    # print(course_name)
    # print(course_img)
    # 3.反向查找: 从Course表中,找到 在PricePolicy对应的数据
    course_obj = Course.objects.get(pk=1)
    ret = course_obj.policy_list.all()
    li = [{'id': i.id, "价格": i.price, "周期": i.valid_period} for i in ret]
    print(li)
    return HttpResponse('ok')

 

转载于:https://www.cnblogs.com/wt7018/p/11543603.html

### Django 内置功能和组件介绍 #### 高级 Web 开发框架特性 Django 是一个用 Python 编写的高级 Web 框架,其设计旨在促进快速开发和实现清晰、实用的应用程序架构[^1]。 #### 主要内置组件概述 为了支持高效且安全的Web应用开发,Django集成了多种核心组件: - **模型层 (Models)**:负责数据库抽象操作,允许开发者通过Python类定义数据结构,并执行CRUD(创建、读取、更新、删除)操作。 - **视图层 (Views)**:处理HTTP请求逻辑,可以返回HTML页面或其他响应内容给客户端。视图函数接收HttpRequest对象作为参数,并返回HttpResponse对象或者渲染模板后的结果。 - **模板引擎 (Templates)**:提供了一种简单的方式来生成动态网页内容。它能够嵌入变量以及控制语句到静态文件中去,从而使得前端展示更加灵活多变。 - **表单与校验器 (Forms and Validators)**:简化了用户输入数据收集流程的同时也加强了安全性保障;这些工具可以帮助自动生成功能性的HTML表单字段,并对提交的信息实施必要的验证规则[^3]。 - **认证授权系统 (Authentication & Authorization System)**:实现了完整的用户账户管理机制,包括登录/登出、密码重置等功能,同时也提供了权限控制系统以保护敏感资源免受未授权访问的影响。 - **分页组件 (Pagination Component)**:当面对大量记录时,此部件有助于合理分配显示条目数量,提高用户体验感。只需几行简单的配置即可轻松集成至现有查询集中[^4]。 - **ContentType Framework**:该框架为每一种已注册的内容类型创建了一个通用接口,便于跨不同类型的模型之间建立关联关系。这特别适用于构建像评论系统这样的应用场景,在那里可能涉及到多个不同的实体对象之间的交互行为[^2]。 - **序列化模块 (Serializers Module)**:对于现代web服务而言,JSON是最常用的API交换格式之一。因此,Django引入了序列化工具来转换复杂的数据结构成易于传输的形式,比如将QuerySet实例转化为JSON字符串以便于前后端间通信[^5]。 ```python from django.shortcuts import HttpResponse from app01 import models from django.core import serializers def user(request): user_data = models.User.objects.all() res = serializers.serialize('json', user_data) return HttpResponse(res, content_type='application/json') ``` 上述代码展示了如何利用`serializers`库把来自ORM的结果集转码成适合网络传输的JSON串形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值