【问题标题】:Django ManyToMany Field with an already existing table具有已存在表的 Django ManyToMany 字段
【发布时间】:2017-04-06 12:44:10
【问题描述】:

我想要实现的是,让 Django 创建和管理的模型 Person 有一个带有模型 Property 的 ManyToMany 字段,该字段是使用 inspectdb “创建”的并且已经存在于数据库中。

Property 包含地理数据,无法由 Django 管理或更改)

当尝试迁移时,它会引发:

ValueError:无法解析相关模型“cadastroapp.Property”

Full stack here

我从迁移文件中删除创建模型 Property 的步骤毫无价值,因为它已经存在并且 AFAIK 无法在模型类中告诉 Django

models.py(简化版):

class Person(models.Model):
    objectid = models.AutoField(primary_key=True)
    properties = models.ManyToManyField(
        'Property', 
        through = 'Person_Property',
        )
    class Meta:
        db_table = 'django_person'

class Person_Property(models.Model):
    cod_person = models.ForeignKey('Person', on_delete=models.CASCADE)
    cod_property = models.ForeignKey('Property', on_delete=models.CASCADE)

    class Meta:
        db_table = 'django_person_property'

class Property(models.Model):
    objectid = models.BigIntegerField(unique=True, primary_key=True)
    created_user = models.CharField(max_length=765, blank=True, null=True)
    created_date = models.DateTimeField(blank=True, null=True)
    last_edited_user = models.CharField(max_length=765, blank=True, null=True)
    last_edited_date = models.DateTimeField(blank=True, null=True)
    shape = models.TextField(blank=True, null=True)  # This field type is a guess. - ESRI Shape

    class Meta:
        managed = False
        db_table = '"GEO"."PROPERTY"'

【问题讨论】:

标签: python django oracle django-models


【解决方案1】:

您的 models.py 文件中有几个错误。 在定义 Foreignkey 或 ManytoMany 字段时,您不希望模型名称包含在引号中。

请更改:

class Person(models.Model):
    properties = models.ManyToManyField(
        'Property', 
        through = 'Person_Property',
        )

class Person_Property(models.Model):
    cod_person = models.ForeignKey('Person', on_delete=models.CASCADE)
    cod_property = models.ForeignKey('Property', on_delete=models.CASCADE)

到:

class Person(models.Model):
    properties = models.ManyToManyField(
        Property, 
        through = 'Person_Property',
        )

class Person_Property(models.Model):
    cod_person = models.ForeignKey(Person, on_delete=models.CASCADE)
    cod_property = models.ForeignKey(Property, on_delete=models.CASCADE)

然后删除您的迁移文件 cadastroapp.0006_auto_20161122_1533。 然后运行 ​​makemigrations 并再次迁移。

这可能仍然无法毫无错误地迁移,但它会让我们走上正确的轨道。

【讨论】:

  • 即使删除了惰性引用,错误仍然适用,我相信这是因为我手动删除了在迁移中创建 Poperty 模型的位,但如果我不删除它,它会只需引发表已存在的 ORA 错误
  • 如果migrations.CreateModel 所做的只是创建表,我想我可以手动创建它们并进行假迁移,但不确定
  • 我已经创建了一个中间表,它正在生产中使用。现在我想使用through 添加额外的字段。当我这样做时,我收到了这个错误。 “字段通过模型'Photo_Tag'指定多对多关系,尚未安装。”想法?
【解决方案2】:

我认为您想将模型名称放在引号中。如果您不加引号,您必须确保在定义 ManyToMany 字段之前定义模型。因此,您将需要在文件中拥有第一类 Property 和类 Person。当您将模型名称作为“属性”时,您无需关心类定义的顺序。

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 2020-02-18
  • 2018-12-07
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多