1

我正在做我的第一个 Django 项目,并且正在与来自 3rd 方程序的遗留数据库搏斗。对于我试图掌握的一个部分,数据库有一个稍微不寻常的表结构。

基本表格布局如下:

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 是简单地创建从一个人到另一个人的链接以指示婚姻并且没有其他相关性的数字。

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

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

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

我不知道该去哪里。

4

1 回答 1

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 模型更像是一个 hack 而不是修复。目前,Django 的工作方式是您需要将模型字段之一指定为主键。如果找不到这样的字段,它会自动添加一个自动字段id。为了使您的模型工作,您需要指定任何字段作为主键。不管是哪个字段,Django 只需要找到primary_key=True. 有关更多信息,您可以阅读此线程

于 2014-05-18T05:53:04.410 回答