温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Django中ContentType组件怎么用

发布时间:2021-12-06 16:05:01 来源:亿速云 阅读:175 作者:小新 栏目:开发技术

这篇文章将为大家详细讲解有关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测试")

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI