django - Django 模型数据过滤器
问题描述
这是为内部 Django 应用程序的现有数据库(基于 SQL Server)设置一些基本 CRUD 功能的初步尝试。我想要关于模型定义的建议,该模型定义将支持包含贸易伙伴列表并标识合作伙伴类型的主表。合作伙伴实际上可以有多种类型。例如,客户也可以是供应商。然后有一个相关的合作伙伴类型表,它提供了一些额外的详细信息,但主要是分配给合作伙伴类型的文本描述/名称。
当我使用 Django 中的 inspectdb 命令时,我得到了预期的结果,并且在模型中设置了 ForeignKeys。
我想知道是否可以在模型类中包含某种类型的“过滤”以在不同的类中使用同一个表。
例如,为客户(例如 Client_Partner)创建一个模型类,然后为供应商(例如 Supplier_Partner)创建另一个模型类,让它们都指向相同的底层合作伙伴表,但允许为每个“类型”生成单独的表单伙伴?
在创建新客户端期间,TypeID 需要预先填充适当的 TypeId。
我知道不使用管理界面可能更合适,但由于我是 Django 的新手,这是一个内部项目,我认为有可能“开始运行”并获取一些数据输入与一组主要是静态的主数据表。
在此先感谢(恐怕我从示例中学到的东西最好,所以当我阅读了很多帖子和一些文档时,我仍然感到迷茫,没有我可以以基本示例的形式遵循的东西)
示例表数据(在这种情况下,公司 A 既是客户又是供应商)
+--------+-----------------------+---------+
| TypeID | Type | Code |
+--------+-----------------------+---------+
| 0 | Parent | PARENT |
| 1 | Client | CLI |
| 2 | Supplier | SUPP |
+--------+-----------------------+---------+
+-----------+--------------------+--------+-----------+
| PartnerID | name | TypeID | Code |
+-----------+--------------------+--------+-----------+
| 1 | Our Company | 0 | US |
| 10 | Company A | 1 | CA |
| 20 | Company A | 2 | CA |
| 30 | Company B | 2 | CB |
+-----------+--------------------+--------+-----------+
生成的 Django 模型
class Trading_Partner(models.Model):
partnerid = models.IntegerField(db_column='PartnerID', primary_key=True)
code = models.CharField(db_column='Code', max_length=10, blank=True, null=True)
name = models.CharField(db_column='Name', max_length=150, blank=True, null=True)
typeid = models.ForeignKey('Trading_Partner_Type', models.DO_NOTHING, db_column='TypeID', blank=True, null=True)
lei = models.CharField(db_column='LEI', max_length=20, blank=True, null=True)
class Meta:
managed = False
db_table = 'Partner'
class Trading_Partner_Type(models.Model):
typeid = models.IntegerField(db_column='TypeID', primary_key=True)
type = models.CharField(db_column='Type', max_length=50, blank=True, null=True)
code = models.CharField(db_column='Code', max_length=20, blank=True, null=True)
class Meta:
managed = False
db_table = 'PartnerType'
解决方案
要区分不同类型的合作伙伴,您可以使用代理模型。
class PartnerManager(models.Manager):
def __init__(self, partner_type):
super().__init__()
self.partner_type = partner_type
def get_queryset(self):
return super().get_queryset().filter(typeid=self.partner_type)
class Client_Partner(Trading_Partner):
objects = PartnerManager(1)
class Meta(Trading_Partner.Meta):
proxy = True
class Parent_Partner(Trading_Partner):
objects = PartnerManager(0)
class Meta(Trading_Partner.Meta):
proxy = True
class Supplier_Partner(Trading_Partner):
objects = PartnerManager(2)
class Meta(Trading_Partner.Meta):
proxy = True
但我不知道这对于非托管模型是否可行。
推荐阅读
- react-native - 反应原生错误:致命异常:OkHttp Dispatcher;进程:com.tigergameapp,PID:23377;java.lang.OutOfMemoryError:无法分配 JNI 环境
- c - 为什么无符号变量仍然处理负数?
- mysql - MySQL 错误 #1064 - 使用 phpMyAdmin 创建用户
- javascript - 如何使用 konva 绘制带有变换矩阵的形状?
- firebase - 如何在本机反应中显示来自firestore数据库的一组图像?
- jupyter-notebook - 如何从我的终端启动 jupyter notebook?
- r - 除了监控所有目录,如何知道有一个新文件保存了 n
- sass - 当父级悬停在 SCSS 中时更改子类的定义
- nativescript - 图像未显示在 Android 上的 ActionBar 中
- docker - docker-compose 文件的等效 docker run 命令