Django 1.10 - makemigrations 命令未检测到非托管模型的更改
Django 1.10 - makemigrations command not detecting changes for unmanaged models
在此先感谢您的帮助。在 mi 项目中,我有一个应用程序涉及从现有数据库生成的模型。由于这些表由 DBA 管理,因此它们保持为非托管模型。由于模式发生变化,我们可能需要从数据库重新生成模型,因此我们为每个模型创建了替代代理模型,以将我们管理的部分与我们不管理的部分分离。您可以在下面看到基于我们当前布局的示例。
该示例显示了一个生成模型与另一个生成模型的 FK,因此代理模型具有对非代理模型的引用。我已经阅读了指向 here 的讨论并尝试了其中显示的一些方法,但是其中 None 对我有用。所以现在我正在尝试更新生成的模型以指向代理模型,我认为这不会造成任何问题。
正如我所见,Django 为非托管模型生成了一个迁移,我认为 makemigration 会检测到该模型的 FK 中的变化。但是,当我 运行 manage.py makemigrations
时显示没有检测到变化。 这是非托管模型的 makemigrations 的预期行为吗?
# app/models.py
class SacLocation(models.Model):
sacloc_location_id = models.IntegerField(primary_key=True)
sacloc_name = models.CharField(max_length=50, blank=True, null=True)
sacloc_state = models.IntegerField(blank=True, null=True)
# I'm changing this Field to point to the proxy model
# e.g. it will look like this, but the change is not detected by makemigrations
# sacloc_location_grouping = models.ForeignKey('LocationGroupingProxy',
# models.DO_NOTHING, db_column='sacloc_location_grouping')
sacloc_location_grouping = models.ForeignKey('SacLocationGrouping',
models.DO_NOTHING, db_column='sacloc_location_grouping')
class Meta:
managed = False
db_table = 'sac_location'
class SacLocationGrouping(models.Model):
saclgr_location_grouping__id = models.IntegerField(primary_key=True)
saclgr_name = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'sac_location_grouping'
class LocationProxy(SacLocation):
class Meta:
proxy = True
def __str__(self):
return u'%s' % (self.sacloc_name)
class LocationGroupingProxy(SacLocationGrouping):
class Meta:
proxy = True
def __str__(self):
return u'%s' % (self.saclgr_name)
我对我的代码进行了一些更改,以将非托管模型(最初 FK 指向其他非托管模型)指向代理模型。 None 这些更改已导致生成新的迁移,因此我认为在这种情况下是预期的行为。查看了 Django 源代码,但未能发现检测到此更改的位置。最后,当我对代理模型中的 Meta 选项(例如排序)进行更改时,Django 实际上检测到了更改并创建了一个新的迁移。
在此先感谢您的帮助。在 mi 项目中,我有一个应用程序涉及从现有数据库生成的模型。由于这些表由 DBA 管理,因此它们保持为非托管模型。由于模式发生变化,我们可能需要从数据库重新生成模型,因此我们为每个模型创建了替代代理模型,以将我们管理的部分与我们不管理的部分分离。您可以在下面看到基于我们当前布局的示例。
该示例显示了一个生成模型与另一个生成模型的 FK,因此代理模型具有对非代理模型的引用。我已经阅读了指向 here 的讨论并尝试了其中显示的一些方法,但是其中 None 对我有用。所以现在我正在尝试更新生成的模型以指向代理模型,我认为这不会造成任何问题。
正如我所见,Django 为非托管模型生成了一个迁移,我认为 makemigration 会检测到该模型的 FK 中的变化。但是,当我 运行 manage.py makemigrations
时显示没有检测到变化。 这是非托管模型的 makemigrations 的预期行为吗?
# app/models.py
class SacLocation(models.Model):
sacloc_location_id = models.IntegerField(primary_key=True)
sacloc_name = models.CharField(max_length=50, blank=True, null=True)
sacloc_state = models.IntegerField(blank=True, null=True)
# I'm changing this Field to point to the proxy model
# e.g. it will look like this, but the change is not detected by makemigrations
# sacloc_location_grouping = models.ForeignKey('LocationGroupingProxy',
# models.DO_NOTHING, db_column='sacloc_location_grouping')
sacloc_location_grouping = models.ForeignKey('SacLocationGrouping',
models.DO_NOTHING, db_column='sacloc_location_grouping')
class Meta:
managed = False
db_table = 'sac_location'
class SacLocationGrouping(models.Model):
saclgr_location_grouping__id = models.IntegerField(primary_key=True)
saclgr_name = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'sac_location_grouping'
class LocationProxy(SacLocation):
class Meta:
proxy = True
def __str__(self):
return u'%s' % (self.sacloc_name)
class LocationGroupingProxy(SacLocationGrouping):
class Meta:
proxy = True
def __str__(self):
return u'%s' % (self.saclgr_name)
我对我的代码进行了一些更改,以将非托管模型(最初 FK 指向其他非托管模型)指向代理模型。 None 这些更改已导致生成新的迁移,因此我认为在这种情况下是预期的行为。查看了 Django 源代码,但未能发现检测到此更改的位置。最后,当我对代理模型中的 Meta 选项(例如排序)进行更改时,Django 实际上检测到了更改并创建了一个新的迁移。