这是为内部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'
答案 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
但是我不知道对于非托管模型这是否可行。