Django ContentType组件详解
作者:小Pawn爷 时间:2022-04-11 14:19:26
目录
问题
注意
总结
问题
如何在一张表上对多个表进行外键关联
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
标签:Django,ContentType,组件


猜你喜欢
MySQL查询性能优化七种方式索引潜水
2024-01-20 01:11:35

如何进行MySQL数据库表的故障检测
2009-02-10 10:34:00
Python 错误和异常小结
2021-08-19 12:17:58
关于reduce的介绍及用法说明
2024-04-18 10:49:34

Python面向对象之类和对象属性的增删改查操作示例
2021-11-06 14:20:40
JS中检测数据类型的几种方式及优缺点小结
2024-04-16 09:14:41
mysql如何通过当前排序字段获取相邻数据项
2024-01-13 02:24:25
SQL Server中读取XML文件的简单做法
2008-12-23 15:29:00
ASP.NET Core2读写InfluxDB时序数据库的方法教程
2024-01-29 03:55:01
使用Python的package机制如何简化utils包设计详解
2021-08-14 04:21:06
PHP实现根据数组某个键值大小进行排序的方法
2023-11-15 00:35:55
python生成圆形图片的方法
2021-04-09 14:48:15

Python如何使用print()函数输出格式化字符串
2021-03-09 22:43:41

javascript实现计算器功能详解流程
2024-04-23 09:27:00

浅谈Python的正则表达式
2022-05-11 00:54:16

用SQL语句解决mysql导入大数据文件的问题
2024-01-13 05:52:23
全文译稿 Windows Internet Explorer 8 性能优化白皮书
2010-04-23 20:13:00
轻松掌握SQL Server存储过程的命名标准
2009-01-15 13:14:00
Tensorflow加载Vgg预训练模型操作
2023-10-13 10:56:23

使用Python对Excel进行读写操作
2022-05-25 16:56:32