我一直在勾选一个新的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'.
答案 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
属性,以便向后关系属性的名称不会冲突。