2015-09-24 3 views
0

Я набрасывать новое приложение Django с сервером runserver DEV работает в фоновом окне для отслеживания сетевого подключения, и кратко было это в моей модели:Переходы Django - как заставить его забыть?

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) 

Прежде чем я понял, что я не мог» t имеет одинаковое имя_соединения для двух полей. Думаю, мне нужно будет написать что-то особенное, чтобы найти все подключения, связанные с интерфейсом, поскольку они могут быть «до» или «от» конца соединения (заинтересованы в любом понимании по более приятному способу сделать это - как поле «Установить»)

на данный момент, я не сделал makemigrations, но на остановке сервера, и делает мои миграции, я получаю:

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'. 

Даже несмотря на это не столкновение больше. Я не вижу каталог миграции в любом месте - это был начальный прогон в моделях - так где же память этой ошибки возникает после перезапуска dev-сервера?

Edit: Для того, чтобы сделать его более четким, моя модель соединения теперь выглядит следующим образом:

class Connection(models.Model): 
    interface_from = models.ForeignKey(Interface) 
    interface_to = models.ForeignKey(Interface) 
    source = models.CharField(max_length=32) 
+1

Как выглядит ваша обновленная модель «Connection»? –

+0

изменить родственное имя, не может быть равным –

+0

@JoshKelley - обновил вопрос для вас – AnotherHowie

ответ

1

В первом примере:

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

Вы хотите сказать, Джанго, чтобы создать два различных 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 атрибутов, так что имена аттрибутов задом отношений не конфликтуют.

+0

D'oh - Я почему-то думал, что по какой-то причине будет использовать имя поля, а не имя модели для обратной связи. Спасибо за объяснение! – AnotherHowie

2

В случае, если вам не нужен назад отношение добавить related_name='+' к вашему определению поля. Из doc:

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

Без этого я получу (в основном бесполезный, но не вредный) интерфейс Interface.interface_from_set и Interface.interface_to_set? Полезно знать, что можно отключить, как только исходная проблема будет решена. – AnotherHowie