首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django模型数据过滤器

Django模型数据过滤器
EN

Stack Overflow用户
提问于 2019-03-28 02:03:14
回答 1查看 60关注 0票数 0

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

当我使用Django的inspectdb命令时,我得到了预期的结果,并且在模型中设置了ForeignKeys。

我想知道是否有可能在Model中包含某种类型的“筛选”,以便跨不同的类使用相同的表。

例如,为客户端创建一个模型类(例如。Client_Partner),然后是供应商的另一个(如。Supplier_Partner)它们都指向相同的底层合作伙伴表,但允许为每种“类型”的合作伙伴生成单独的表单?

在创建新客户端期间,TypeId需要预先填充适当的TypeID。

我知道,不使用Admin Interface可能更合适,但由于我是Django的新手,而且这是一个内部项目,我认为有可能‘开始运行’,并根据一组基本静态的主数据表获得一些数据输入。

预先感谢(恐怕我从例子中学到了最好的东西,因此,虽然我已经阅读了许多帖子和一些文档,但如果没有一些我可以遵循的基本示例形式,我仍然感到迷茫)。

示例表数据(在本例中,公司A既是客户也是供应商)

代码语言:javascript
复制
+--------+-----------------------+---------+
| 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模型

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 11:21:45

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

代码语言:javascript
复制
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

但我不知道在非托管模型下这是否可能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55389115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档