Django Model数据过滤器

时间:2019-03-28 02:03:15

标签: django model

这是为内部Django应用为现有数据库(基于SQL Server)设置一些基本CRUD功能的初始尝试。我想要有关模型定义的建议,该模型支持一个主表,该主表包含一个贸易伙伴列表并标识一个伙伴类型。合作伙伴实际上可以有多种类型。例如,客户也可以是供应商。然后有一个PartnerTypes相关表,提供了一些额外的详细信息,但主要是分配给Partner Type的文本描述/名称。

当我使用来自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'

1 个答案:

答案 0 :(得分:0)

要区分不同类型的合作伙伴,可以使用proxy models

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

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