我的编程空间,编程开发者的网络收藏夹
学习永远不晚

DjangoContentType组件详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

DjangoContentType组件详解

问题

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


from django.db import models
class 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 models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation

class 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测试")

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

DjangoContentType组件详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

AndroidJetpack组件DataBinding详解

这篇文章主要介绍了AndroidJetpack组件DataBinding,DataBinding有很多优势,其中最明显是代码更加简洁,可读性会更高。部分和UI控件有关的代码可以在布局文件当中完成,本文给大家详细讲解,需要的朋友可以参考下
2022-11-13

详解Android中BroadCastReceiver组件

BroadcastReceiver也就是“广播接收者”的意思,它是用来接收来自系统和应用中的广播。 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Br
2022-06-06

Android中ContentProvider组件详解

ContentProvider是Android中的一种组件,用于管理应用程序之间共享的数据。它提供了一种标准化的接口,使得应用程序可以访问其他应用程序的数据,并支持对数据进行增删改查的操作。ContentProvider的主要作用是提供数据
2023-08-25

SpringCloudGateway路由组件详解

SpringCloudGateway是SpringCloud的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。这篇文章主要介绍了SpringCloudGateway网关作用,需要的朋友可以参考下
2023-02-22

Android中 service组件详解

service组件跟activity组件及其类似,可以说service是没有界面的activity,当然service的生命周期和activity还是有一定的差别的。 service组件一般用在什么地方的,上面讲了service组件没
2022-06-06

Springcloud之Gateway组件详解

SpringCloudGateway是SpringCloud微服务生态下的网关组件。SpringCloudGateway是基于Spring5和SpringBoot2搭建的,本质上是一个SpringBoot应用。本文详细介绍了SpringCloud的网关组件Gateway,,需要的朋友可以参考下
2023-05-19

一文详解React组件API

这篇文章主要介绍了React的组件API,及组件API的用法详解,文中有详细的代码示例,对学习或工作有一定的参考价值,感兴趣的同学可以阅读本文
2023-05-17

vue3封装ECharts组件详解

前端开发需要经常使用ECharts图表渲染数据信息,在一个项目中我们经常需要使用多个图表,选择封装ECharts组件复用的方式可以减少代码量,增加开发效率。感兴趣的可以阅读一下本文
2023-05-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录