首页 > 其他分享 >GenericForeignKey和GenericRelation的用法

GenericForeignKey和GenericRelation的用法

时间:2022-12-02 15:46:46浏览次数:65  
标签:models GenericRelation 用法 GenericForeignKey TextField django True

GenericForeignKey和GenericRelation的用法

背景:

假设现在有几个新增的数据都需要审批如地址,销售单信息等,并且后续还会有,使用外键的写法为

from django.db import models
from django.contrib.auth.models import User

# 地址
class Address(models.Model):
    owner = models.ForeignKey(User,on_deleter=models.CASCADE)
    addr = models.TextField(blabk=True)

# 销售单    
class SaleOrder(models.Model):
    owner = models.ForeignKey(User,on_deleter=models.CASCADE)
    order_data = models.TextField(blabk=True)

# 审批单    
class Apply(models.Model):
    body = models.TextField(blabk=True)
    address = models.ForeignKey(Address,on_deleter=models.CASCADE,null=True)
    sale_order =  models.ForeignKey(SaleOrder,on_deleter=models.CASCADE,null=True)

这个情况会导致,每新增一个需要审批的模型,Apply就要加一个字段

而且,那么多的外键,只有某个外键有值

有没有一种外键,可以关联所有想关联的模型?有

它就是通用外键GenericForeignKey

使用

  • GenericForeignKey和GenericRelation需要一起使用
  • 配置
# settings.py
INSTALLED_APPS = [
	...
	"django.contrib.contenttypes",
	...
]
  • 改写模型
from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey

# 地址
class Address(models.Model):
    owner = models.ForeignKey(User,on_deleter=models.CASCADE)
    addr = models.TextField(blabk=True)
    apply = GenericRelation(Apply)

# 销售单    
class SaleOrder(models.Model):
    owner = models.ForeignKey(User,on_deleter=models.CASCADE)
    order_data = models.TextField(blabk=True)
    apply = GenericRelation(Apply)

# 审批单    
class Apply(models.Model):
    body = models.TextField(blabk=True)
    content_type = JyForeignKey(ContentType, on_delete=models.SET_NULL, null=True)
    object_id = models.PositiveIntegerField('审批对象ID', default=None, null=True)
    # 可以在审批对象表上加GenericRelation 方便反向关联
    # approval_obj作用是只要这一个字段,就能关联多个表
    approval_obj = fields.GenericForeignKey('content_type', 'object_id')
  • 其他

有需要的可以查看官方文档:https://docs.djangoproject.com/en/2.2/ref/contrib/contenttypes/

标签:models,GenericRelation,用法,GenericForeignKey,TextField,django,True
From: https://www.cnblogs.com/zaxl932946/p/16944641.html

相关文章

  • 防火墙、WAF、IPS、IDS 用法解读
    防火墙(Firewall)别名防护墙,于1993发明并引入国际互联网。他是一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。在网络中,所谓的防火墙是指一种将内网......
  • 复习struts2中常见的三个用法
    在使用struts2时,发现有如下三个知识点和用法还是挺常用的,小结之,分别是:displaytag,struts2的验证和struts2的model-driven.1displaytag的使用disp......
  • Require.js中shim的用法
    普通js文件加载 //test.jsfunctiontest(){}//配置require.config({paths:{test:'lib/shim/test'},shim:{test:{......
  • 15个Docker基本命令及用法
    查看docker安装信息dockerinfo获取docker镜像dockerpullazraelrabbit/monupw创建docker容器dockerrun--namemonojexus-d-p32022:22-p32080:80-v/mydata:/data......
  • Vue2+Vue3 - $attrs 的几种用法(1个或多个根元素、Options API 和 Composition API)
    使用Vue开发时,肯定会接触到组件的概念,无可避免的也会接触到组件通讯的概念。在Vue2中除了$attrs外,还有$listeners;Vue3把$listeners合并到$attrs里了。......
  • string.Join用法
    原文链接:https://blog.csdn.net/useringo/article/details/51684370String.Join方法(String,String[])在指定String数组的每个元素之间串联指定的分隔符String,从而......
  • js 扩展运算符(...)的用法
    在日常开发中,我们在看js代码时,经常会看到(...)这样的符号。这里介绍一下它的含义和作用。定义:扩展运算符(...)是ES6的语法,用于取出参数对象的所有可遍历属性,然后拷贝到当前......
  • DRF-筛选的高级用法
    高级使用实现模糊过滤,比如包含,大于,小于等等1.编写自己的过滤器类过滤器类和Django中表单类极其类似,写法基本一样,目的是指明过滤的时候使用哪些字段进行过滤,每个字段可以......
  • C#的switch的用法及模式匹配
    switch-case语句经常被认为是if-else语句的替代品,但是在众多程序语言中还是能见到switch的存在,这很大程度上是因为switch更实用,这一点在C#中更能提现。简单的语......
  • html使用frame框架目录导航跳转至指定章节的用法
    html使用frame框架导航跳转至指定节的用法,实现在同一个页面中不使用js进行页面的跳转。左边页面是目录页,右边是内容页。点击左边目录,右边内容页跳转到相应的章节。实现代......