首页 > 解决方案 > 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'

标签: djangomodel

解决方案


要区分不同类型的合作伙伴,您可以使用代理模型

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

但我不知道这对于非托管模型是否可行。


推荐阅读