Django ContentType组件详解
作者:小Pawn爷 发布时间:2022-04-11 14:19:26
标签:Django,ContentType,组件
目录
问题
注意
总结
问题
如何在一张表上对多个表进行外键关联
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测试")
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
来源:https://blog.csdn.net/weixin_44689630/article/details/121736537


猜你喜欢
- 昨晚着手给个人博客增加网易微博的调用,在Opera下却出现了一个意想不到的问题。内容的展示,一开始是做成横向不间断滚动(现在已经改成纵向定时
- 在研究ezSQL的时候就看到了mssql_connect()等一些php提供的连接MSSQL的函数,本以为php这个开源的风靡世界的编程语言
- 本文实例讲述了JS模拟简易滚动条效果的方法。分享给大家供大家参考,具体如下:使用Js模拟滚动条。简易模式,类似手机上常见的滚动条。效果如下:
- Vue按回车键进行搜索需求:为了用户方便进行搜索数据的时候不想点击搜索按钮,想要在input输入框内输入完成之后直接按回车键进行搜索第一种方
- Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。如下:1.raw_input2.inputraw_input函数
- nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=
- 一、前言在程序中,有很多高效率的字符串处理方式,如果开发者能够完全掌握这些高效的字符串处理,往往在开发者也能事半功倍。比如针对于字符串的处理
- 笔者通过一周的时间,询问了许多设计人员真实用户,以便确保这六个方面确实是大多数用户所不喜并且有非常大的概率普遍存在于众多的医疗网站之中。那么
- 本文主要介绍的是vue.js插入dom节点的方法,下面话不多说,来看看详细的介绍吧。html代码:<div id="app&
- 导言:在前面的教程我们阐述了应用程序处理二进制数据的2种模式,以及使用FileUpload 控件从浏览器向服务器文件系统上传文件。当文件上传
- 方法一使用findspark使用pip安装findspark:pip install findspark在py文件中引入findspark:
- 本文实例讲述了Python实现的插入排序,冒泡排序,快速排序,选择排序算法。分享给大家供大家参考,具体如下:#!/usr/bin/pytho
- 如题:只需要给定输出特征图的大小就好,其中通道数前后不发生变化。具体如下:AdaptiveAvgPool2d CLASStorch.nn.A
- 简介urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接。urlparse库用于把url解析为
- 通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割
- python作为使用最广泛的编程语言之一,有着无穷无尽的第三方非标准库的支持。简单的语法、优雅的代码块使其在各个业务领域都混的风生水起,除了
- 本文实例为大家分享了Vue+Echarts实现简单折线图的具体代码,供大家参考,具体内容如下Vue+Echarts实现一个折线图,打开vue
- 本文实例为大家分享了Golang实现文件传输的具体代码,供大家参考,具体内容如下借助TCP完成文件的传输,基本思路如下:1、发送方(客户端)
- 任务异步化打开浏览器,输入地址,按下回车,打开了页面。于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应
- 目录1、创建对象2、保存ForeignKey和ManyToManyField字段3、检索对象跨越多值的关系查询使用F表达式引用模型的字段:4