千家信息网

Django中ContentType组件怎么用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章将为大家详细讲解有关Django中ContentType组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题如何在一张表上对多个表进行外键关联fro
千家信息网最后更新 2026年10月31日Django中ContentType组件怎么用

这篇文章将为大家详细讲解有关Django中ContentType组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

问题

如何在一张表上对多个表进行外键关联

from django.db import modelsclass Appliance(models.Model):    """    家用电器表    id name    1   冰箱    2   电视    3   洗衣机    """    name = models.CharField(max_length=64)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)

注意

1.每增加一张表就需要多增加一个字段,

定义

当一张表要跟多张表进行外键关联的时候,我们可以使用Django提供的ContentType 组件

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

app1/models.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-from django.db import modelsfrom django.contrib.contenttypes.models import ContentTypefrom django.contrib.contenttypes.fields import GenericForeignKey, GenericRelationclass Food(models.Model):    """    id      title    1       面包    2       牛奶    """    title = models.CharField(max_length=32)    # 不会生成coupons字段,只用于反向查询    coupons = GenericRelation(to="Coupon")class Fruit(models.Model):    """    id      title    1       苹果    2       香蕉    """    title = models.CharField(max_length=32)class Coupon(models.Model):    title = models.CharField(max_length=32)    # 第一步:在 model中定义ForeignKey字段,并关联到ContentType表    content_type = models.ForeignKey(to=ContentType, on_delete=None)    # 第二步:定义IntegerField字段,用来存储关联表中的主键    object_id = models.IntegerField()    # 第三步 不会生成字段传入上面两个字段的名字    content_object = GenericForeignKey("content_type", "object_id")

app1\view.py

class DemoView(APIView):    def get(self, request):        # 1.通过ContentType表找表模型        content = ContentType.objects.filter(app_label="app1", model="food").first()        # 获得表model对象 相当于models.app1        model_class = content.model_class()        ret = model_class.objects.all()        print(ret)        # 给面包创建一个优惠券        food_obj = Food.objects.filter(id=1).first()        Coupon.objects.create(title="面包九五折", content_type_id=8, object_id=1)        Coupon.objects.create(title="双十一面包九折促销", content_object=food_obj)        # 正向查询:根据优惠信息查询优惠对象        coupon_obj = Coupon.objects.filter(id=1).first()        content_obj = coupon_obj.content_object        print(content_obj.title)        # 反向查询:查询面包都有哪些优惠券        coupons = food_obj.coupons.all()        print(coupons[0].title)        # 如果没定义反向查询        content = ContentType.objects.filter(app_label="app1", model="food").first()        result = Coupon.objects.filter(content_type=content, object_id=1).all()        print(result[0].name)        return Response("ContentType测试")

关于"Django中ContentType组件怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

字段 面包 优惠 查询 组件 优惠券 关联 篇文章 苹果 冰箱 对象 折扣 更多 牛奶 电视 香蕉 生成 不错 实用 家用电器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技图片 中国互联网科技工作委员会毛军 互联网科技公司的优势 深圳齐家互联网科技 腾讯科技 互联网女皇 互联网科技上市公司 互联网科技大会 老年人脱离互联网科技的作文 哈尔滨新华互联网科技学院 湖北码尼互联网科技有限公司电话 移动互联网科技公司 新兴科技互联网创新大赛颁奖典礼 辽宁互联网新科技 允成互联网科技有限公司融资 西安小鹰速贷互联网科技有限公司 科技互联网海报 沐思想互联网科技有限公司 北京市互联网新科技 互联网安防科技感 恒生科技互联网指数十大成分股 华服互联网科技怎么样 科技与互联网发展 中国的互联网科技企业的崛起 广州市恰铎互联网科技有限公司 互联网科技大赛获奖感言 互联网科技如何创业 互联网科技年终奖 抖集互联网科技技术咨询 北京瑞云互联网科技有限公司 恒生科技互联网指数十大成分股
0