我有一个包含下表的旧数据库:
人
person_id (PK) | first_name | last_name
1 | John | Doe
2 | David | Bentley
电话号码
person_id (FK,PK) | phone_number (PK) | area_code (PK)
1 | 758-4551 | 909
1 | 763-3445 | 909
2 | 634-0011 | 637
每个人都可以有零个或多个电话号码,这是人实体的多值属性。
我尝试使用 Django 的 informdb 命令生成以下 models.py:
class Person(models.Model):
person_id = models.BigIntegerField(primary_key=True)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
class Meta:
managed = False
db_table = 'person'
class PhoneNumbers(models.Model):
person = models.ForeignKey(Person, models.DO_NOTHING)
phone_number = models.CharField(max_length=15)
area_code = models.CharField(max_length=15)
class Meta:
managed = False
db_table = 'phonenumbers'
unique_together = (('person', 'phone_number', 'area_code'),)
但是,当我尝试保存 PhoneNumbers 的新实例时,Django 返回以下错误消息:
django.db.utils.ProgrammingError: column phonenumbers.id does not exist
显然 Django 希望电话号码的表有一个代理键。 由于电话号码的表不是实体,因此它在我的旧数据库中没有代理键。请注意,电话号码表的主键是其所有列的组合。
如何将这些表映射到 Django 模型中,以便它可以与我的旧数据库一起使用?
最佳答案
在 Django 中,所有模型(为您编写或使用 InspectDB 生成)must kave Primary Key .
如果您想像模型一样使用电话号码表,则需要该表有一个主键。
在这种情况下,我的建议是您修改旧表以手动添加新主键并丢弃复合主键。您的旧表有一个复合主键(phone_number+area_code),Django 不正式支持此功能。
关于python - 如何在 Django 中实现多值属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37711512/