您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Django ContentType组件详解

51自学网 2022-02-21 10:46:15
  python
这篇教程Django ContentType组件详解写得很实用,希望能帮到您。

问题

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

from django.db import modelsclass 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 modelsfrom django.contrib.contenttypes.models import ContentTypefrom django.contrib.contenttypes.fields import GenericForeignKey, GenericRelationclass 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测试")

总结

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


SpringBoot调用python接口的实现步骤
Python词频统计的两种方法详解
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。