具有已存在的表的Django ManyToMany字段

时间:2016-11-22 18:02:41

标签: python django oracle django-models

我想要实现的是,由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"'

1 个答案:

答案 0 :(得分:0)

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并再次迁移。

这可能仍然无法在没有错误的情况下迁移,但它会使我们走上正轨。