Django迁移 - 如何让它忘记?

时间:2015-09-24 14:38:08

标签: python django django-migrations

我一直在勾选一个新的Django应用程序,其中runserver dev服务器在后台窗口运行以跟踪网络布线,简要在我的模型中有这个:

RewriteEngine On

RewriteCond %{THE_REQUEST} GET\ /([a-z]+)\-(\d+) [NC]
RewriteRule ^ /%1/%2 [R=301,L]

RewriteRule ^([a-z]+)/(\d+)$ /$1-$2 [L]

在我意识到我无法为两个字段提供相同的related_name之前。我想我需要写一些特别的东西来找到与接口相关的所有连接,因为它们可能是连接的“到”或“从”端(对任何有关更好的方法的任何见解感兴趣 - 比如“设置”字段)

此时,我还没有做过makemigrations,但是在停止服务器和进行迁移时,我得到了:

class Interface(models.Model):
    name = models.CharField(max_length=200)
    # (blah)

class Connection(models.Model):
    interface_from = models.ForeignKey(Interface, related_name="connections")
    interface_to = models.ForeignKey(Interface, related_name="connections")
    source = models.CharField(max_length=32)

即使没有冲突了。我没有在任何地方看到迁移目录 - 这是模型的初始传递 - 那么在重新启动dev服务器之后,这个错误的内存将来自何处?

编辑:为了更清楚,我的Connection模型现在看起来像:

ERRORS:
autodoc.Connection.interface_from: (fields.E304) Reverse accessor for 'Connection.interface_from' clashes with reverse accessor for 'Connection.interface_to'.
HINT: Add or change a related_name argument to the definition for 'Connection.interface_from' or 'Connection.interface_to'.

2 个答案:

答案 0 :(得分:2)

如果您不需要向后关系,请在字段定义中添加related_name='+'。来自doc

user = models.ForeignKey(User, related_name='+')

答案 1 :(得分:1)

在你的第一个例子中:

class Connection(models.Model):
    interface_from = models.ForeignKey(Interface, related_name="connections")
    interface_to = models.ForeignKey(Interface, related_name="connections")

您告诉Django在connections上创建两个不同的Interface属性,以便向后回到Connection,这显然不起作用。

在你的第二个例子中:

class Connection(models.Model):
    interface_from = models.ForeignKey(Interface)
    interface_to = models.ForeignKey(Interface)

你告诉Django使用its default connections_set name将两个不同的属性用于返回Connection的向后关系,这也不起作用。

修复方法是使用related_name='+'(作为@Ivan said)完全禁用向后关系,或者两个显式提供两个不同的related_name属性,以便向后关系属性的名称不会冲突。