python - 如何在 Django 中实现多值属性?

标签 python django database legacy-database

我有一个包含下表的旧数据库:

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/

相关文章:

python - 在 Python 中使用 credstash

Python Flask 只运行一次代码

javascript - 在 node.js 中抓取经过身份验证的网站

Python 元素树 "Invalid descendant"错误

python - 父类setUp中的Django TestCase错误

python - 保持 Django 模型清洁方法验证外键对象并使用 ModelForm 保存

django - 如何在 django View 中检索静态文件的内容?

java - 如何将 jar 文件转换为其中包含 MySQL 的可执行文件?

php - 显示变量从 1 .php 到另一个 .php 时出现问题

sql-server - SQL : how to retrieve data in month and year range