Django 使用Contenttype组件创建多关联数据库表

from django.db import models

‘‘‘contenttype使用意义:如果使用contenttypes就不需要再使用多个Foreignkey,
因为在django_content_type表已经存储了app名和model名,
所以我们只需要将我们创建的模型与django_content_type表关联起来,
然后再存储一个实例 id 即可准确定位到某个app中某个模型的具体实例
‘‘‘

‘‘‘使用Django的Contenttype字段。‘‘‘
# 导入必需模块
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation

‘‘‘每一个商品都有优惠劵,所以每一个商品都有coupons字段‘‘‘

#电子商品表
class Electrics(models.Model):
    name = models.CharField(max_length=32)
    coupons = GenericRelation(to=‘Coupon‘)

#食物表
class Foods(models.Model):
    name = models.CharField(max_length=32)
    price = models.IntegerField(default=100)
    coupons = GenericRelation(to=‘Coupon‘)

#衣服表
class Clothes(models.Model):
    name = models.CharField(max_length=32)
    price = models.IntegerField(default=200)
    conpons = GenericRelation(to=‘Coupon‘)

#优惠劵表
class Coupon(models.Model):
    name = models.CharField(max_length=31)
    content_type = models.ForeignKey(to=ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey(‘content_type‘, ‘object_id‘)

‘‘‘Coupon,与contenttypes相关的就三个字段:content_tpye   object_id    content_object
content_type字段为外键,指向ContentType这个模型,也就是上面提到的django_content_type表
object_id为一个整数,存储了实例id,实例id不理解可以看下面的数据表结构分析
content_object为GenericForeignKey类型,主要作用是根据content_type字段和object_id字段来定位某个模型中具体某个实例
所以实际上在使用GenericForeignKey()函数时需要传入两个参数,即content_type和object_id字段的名字,注意是名字不是value。
但是默认在该函数的构造函数中已经赋予了默认值,
即"content_type"和"object_id",所以如果我们定义的变量名为这两个,那么我们可以省略该参数。
该字段不会存储到数据库中,在查询的时候ORM会用到。‘‘‘

models.py

‘‘‘使用contentype创建数据的视图函数‘‘‘
class Test(APIView):
    def get(self,request):
        # 1.ContentType表对象有model_class() 方法,取到对应model
        content = models.ContentType.objects.filter(app_label=‘books‘,model=‘clothes‘).first()
        cloth_class = content.model_class()
        res =cloth_class.objects.all()
        print(res)#[<Clothes: Clothes object (1)>, <Clothes: Clothes object (2)>]>

        #2.为食物创建一个优惠劵
        foods_create = models.Foods.objects.filter(id=2).first()
        models.Coupon.objects.create(name=‘食品优惠劵‘,content_object=foods_create)#content_object为隐藏字段

        #3.查询食物优惠劵绑定了那些食物(食物优惠劵ID=1)
        c_obj = models.Coupon.objects.filter(id=1).first()
        b_obj = c_obj.content_object
        print(b_obj)#Foods object (2)
        #4.查询食物绑定了那些优惠劵
        a_obj = models.Foods.objects.filter(id=2).first().coupons.first()
        print(a_obj) #Coupon object (1)

        return HttpResponse(‘ok‘)

views.py

使用Django-contenttype组件总结 : 当一张表和多个表FK关联,并且多个FK中只能选择其中一个或其中n个时,可以利用contenttypes app,只需定义三个字段就搞定!

原文地址:https://www.cnblogs.com/cou1d/p/12349284.html

时间: 2024-10-29 19:11:44

Django 使用Contenttype组件创建多关联数据库表的相关文章

Django之ContentType组件

一.需求 给商品创建优惠券: 看看下面表结构: class Food(models.Model): """ id name 1 面条 """ name = models.CharField(max_length=32) def __str__(self): return self.name class Fruit(models.Model): """ id name 1 苹果 """ n

每天一点数据库之-----Day 2 创建与管理数据库表

每天一点数据库之-----Day 2 创建与管理数据库表 ----转载请注明出处:coder-pig 本节引言: 本节介绍的是数据库中表的创建与管理,另外,因为不同DBMS所 支持的数据类型有所差别,这里就不慢慢阐述了,有需要的自行百度~ 1.创建一个最简单的表 假如:我们定义一个名叫 T_Person的表,表中有三个字段,FId(人员id),FName(人员姓名) FAge(人员年龄),数据类型依次是:整数,长度不确定的字符串类型,整数 SQL语句如下: CREATE TABLE T_Pers

【Django】ContentType组件

目录 理解 表结构 使用 @ 好,现在我们有这样一个需求,我们的商城里有很多的商品,然而节日要来了,我们要搞活动. 那么,我们就要设计优惠券,优惠券都有什么类型呢?满减的.折扣的.立减的.等等等... 我们对应着活动类型,对某类商品设计优惠卷,比如: 家电是一类商品.食物是一类商品,那么我们就可以设计家电折扣优惠券,以及食物满减优惠券等. 所以,我们一顺手,表结构就出来了: from django.db import models is_true = {'null': True, 'blank'

【Django】ContentType组件 -- 2019-08-08 18:03:22

目录 理解 表结构 使用 原文: http://106.13.73.98/__/72/ @ 好,现在我们有这样一个需求,我们的商城里有很多的商品,然而节日要来了,我们要搞活动. 那么,我们就要设计优惠券,优惠券都有什么类型呢?满减的.折扣的.立减的.等等等... 我们对应着活动类型,对某类商品设计优惠卷,比如: 家电是一类商品.食物是一类商品,那么我们就可以设计家电折扣优惠券,以及食物满减优惠券等. 所以,我们一顺手,表结构就出来了: from django.db import models i

Django 之 ContentType组件

一.什么是 ContentTypes ContentTypes 是 Django 内置的一个应用,它可以追踪记录项目中所有 app 和 model 的对应关系,并记录在 django_content_type 表中. 二.ContentTypes 的应用场景 ContentTypes 适用于一张表与多张表相关关联的场景,如:一个卖课程的网站,它主要售卖两类课程(普通课程和学位课程).不同课程之间因学习周期不同,价格也不尽相同.因此就形成了每个课程可能有一个或多个价格策略.类似于下面这种: 如果我

django之模型类、迁移和数据库表之间的关系

环境配置:ubuntu 16.04,Django 1.8.2,MySQL-python 1.2.5 目的是为了了解模型类的定义和其对应数据库里面表的关系 实测发现: 关于模型类和数据库里面的表关系,模型类里面定义的类属性是为了生成数据库里面的表结构使用的,类似mysql里面创建一个表. 一个模型类,对应着数据库里面的一个表. 一个类属性,对应着数据库表里面的一个字段 一个类属性的类型(如charfield),对应着数据库里面字段类型. 进入python manage.py shell运行的pyt

Mysql用存储过程和事件每月定时创建一张数据库表

业务需求,把app用户开机写入一张日志表app_open_log.上线7个月来,有74万条记录了. 现考虑要分库分表了.每个月初创建一张以app_open_log_为前缀,日期年月为后缀的数据库表,比如:app_open_log_201807. 把下面两段复制到sql,执行即可. 首先创建存储过程: DELIMITER // CREATE PROCEDURE create_table_app_open_log_month() BEGIN DECLARE `@suffix` VARCHAR(15)

【2】按照Django官网,创建一个web app 创建app/创建相应的数据库表

1. Creating app $ python manage.py startapp polls That'll create a directory polls, which is laid out like this: polls/ __init__.py admin.py migrations/ __init__.py models.py tests.py views.py 1.1 Edit polls/models.py: from django.db import models cl

创建动态MSSQL数据库表的方法

代码如下: ImportsSystem.Data ImportsSystem.Data.SqlClient PublicClassForm1 InheritsSystem.windows.Forms.Form PrivateConnectionStringAsString="DataSource=.;InitialCatalog=;UserId=sa;Password=;" PrivatereaderAsSqlDataReader=Nothing PrivateconnAsSqlCon