Django:遗留数据库中异常表关系的模型

时间:2014-05-18 05:06:58

标签: python django model legacy-database

我正在进行我的第一个Django项目,正在与第三方程序中的遗留数据库进行斗争。对于我想要掌握的一个部分,DB有一个稍微不同寻常的表结构。

基本表格布局如下:

PERSON
------
z_pk int primary key,
z_name text 

SPOUSEREL
---------
z_person int foreign_key(person.z_pk)
z_spouserel int

所以例如,PERSON包含:

1, John Smith
2, Maggie Brown
3, Bob Johnson
4, Sarah Lee

SPOUSEREL将包含以下内容:

1, 50
2, 50
1, 55
4, 55

这表明约翰史密斯在“结婚号码50”中与玛吉·布朗结婚,而约翰·史密斯也以“结婚号码55”与莎拉·李结婚。数字50和55是简单地创建从一个人到另一个人的链接以表示婚姻而没有其他相关性的数字。

我尝试了各种ManyToManyFieldForeignKey的组合,例如:

class Spouserel(models.Model):
    z_persons = models.ManyToManyField(Person, db_column='z_pk')
    z_spouserels = models.ManyToManyField("self")

但没有成功。通过查看它正在尝试执行的查询,查找失败,Django需要一个ID字段但不存在一个。我想过使用'通过',但在这种情况下,它必须通过自己?

我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

我认为你的模型应该像这些

class Person(models.Model):
    z_pk = models.AutoField(primary_key=True)
    z_name = models.TextField()

class Spouserel(models.Model):
    z_person = models.ForeignKey(Person, db_column='z_pk', primary_key=True)
    z_spouserel = models.IntegerField()

注意

Spouserel模型更像是黑客攻击而不是修复。目前,Django的工作方式是您需要将一个模型字段指定为主键。如果无法找到此类字段,则会自动添加id自动字段。要使模型工作,您需要指定任何字段作为主键。 Django只需要查找primary_key=True这个字段无关紧要。有关详细信息,请参阅此thread