Django ContentType组件

本文深入讲解Django的ContentType组件,介绍如何使用它实现多表之间的灵活关联,避免在优惠券等场景下为每张表增加额外字段。通过实例演示ContentType、GenericForeignKey及GenericRelation的应用,提高代码复用性和维护效率。

ContentType组件

遇到这一张表要跟多张表进行外键关联的时候~我们Django提供了ContentType组件~

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

当我们的项目做数据迁移后,会有很多django自带的表,其中就有django_content_type表,我们可以去看下~~~

ContentType组件应用:

  -- 在model中定义ForeignKey字段,并关联到ContentType表,通常这个字段命名为content-type

  -- 在model中定义PositiveIntergerField字段, 用来存储关联表中的主键,通常我们用object_id

  -- 在model中定义GenericForeignKey字段,传入上面两个字段的名字

  --  方便反向查询可以定义GenericRelation字段

建模:

class Appliance(models.Model):
    """
    家用电器表
    id name
    1   冰箱
    2   电视
    3   洗衣机
    """
    name = models.CharField(max_length=64)
    coupons = GenericRelation(to="Coupon")  # 自用于反向查询 不生成字段
 
 
class Food(models.Model):
    """
    食物表
    id name
    1  面包
    2  牛奶
    """
    name = models.CharField(max_length=32)
 
 
class Fruit(models.Model):
    """
    水果表
    id  name
    1   苹果
    2   香蕉
    """
    name = models.CharField(max_length=32)
 
 
class Coupon(models.Model):
    """
    优惠券表
    id  name    appliance_id    food_id     fruit_id
    1   通用优惠券   null            null        null
    2   冰箱折扣券   1               null        null
    3   电视折扣券   2               null        null
    4   苹果满减卷   null            null        1
    我每增加一张表就要多增加一个字段
    """
    name = models.CharField(max_length=32)
    # appliance = models.ForeignKey(to="Appliance", null=True, blank=True)
    # food = models.ForeignKey(to="Food", null=True, blank=True)
    # fruit = models.ForeignKey(to="Fruit", null=True, blank=True)
    # 第一步 去ContentType表跟表绑定关系
    content_type = models.ForeignKey(to=ContentType)
    # 第二步 对象的id
    object_id = models.PositiveIntegerField()
    # 第三步 通过外检关系给表以及对象id绑定关系 得到对象
    content_object = GenericForeignKey('content_type', 'object_id')  

使用:

from django.http import HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.contenttypes.models import ContentType
from .models import Appliance, Coupon
 
# Create your views here.
 
 
class Test(APIView):
 
    def get(self, request):
        # 通过ContentType获得表名
        content = ContentType.objects.filter(app_label="app01", model="appliance").first()
        # 获得表model对象 相当于models.Applicance
        model_class = content.model_class()
        ret = model_class.objects.all()
 
        # 为海尔冰箱创建一条优惠记录
        ice_box = Appliance.objects.filter(id=1).first()
        Coupon.objects.create(name="海尔冰箱折扣券", content_object=ice_box)
 
        # 查询优惠券id=1绑定了哪个商品
        coupon_obj = Coupon.objects.filter(id=1).first()
        goods_obj = coupon_obj.content_object
        print(goods_obj.name)
 
        # 查询海尔冰箱的所有优惠券 id=1
        # 我们定义了反向查询
        results = ice_box.coupons.all()
        print(results[0].name)
 
        # 如果没定义反向查询
        content = ContentType.objects.filter(app_label="app01", model="appliance").first()
        result = Coupon.objects.filter(content_type=content, object_id=1).all()
        print(result[0].name)
        return HttpResponse(ret)

 

转载于:https://www.cnblogs.com/yidashi110/p/10126872.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、付费专栏及课程。

余额充值