最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Django ContentType组件代码示例解析
时间:2022-06-25 01:32:16 编辑:袖梨 来源:一聚教程网
本篇文章小编给大家分享一下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")
app1view.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测试")
相关文章
- 2024金摇杆奖年度游戏名单 11-22
- 用针在纸上绣画是哪种非遗技艺 蚂蚁新村11月21日答案最新 11-22
- 重返未来1999纸信圈儿什么时候up 为什么故事集卡池活动介绍 11-22
- 重返未来1999雾中盛会怎么玩 UTTU聚光专栏雾中盛会活动介绍 11-22
- 光遇姆明季后续版本怎么玩 光遇音乐节宴会节活动介绍 11-22
- 无期迷途四星装束是谁 无期迷途首个四星装束剪影介绍 11-22