2015-08-06 4 views
1

Я хотел бы создать две модели: 1) Разговор, в котором хранится ссылка на корневое сообщение с заголовком и 2) Сообщение, в котором содержимое/текст сообщения и ссылка возвращаются в кампанию. План состоит в том, чтобы связать сообщения и в конечном итоге создать дерево беседы. Корневое сообщение в разговоре будет выступать в качестве головного (входного) узла связанной сети сообщений.Циркулярная ссылка в модели Django?

Ниже то, что я определил в файлах моделей (conversations/models.py и messages/models.py соответственно):

from messages.models import Message 
class Conversation(models.Model): 
    title = models.CharField('Conversation Title', max_length=500) 
    created_at = models.DateTimeField(auto_now_add=True) 
    composer = models.ForeignKey(User) 
    root_message = models.ForeignKey(Message, null=True, blank=True) 

from conversations.models import Conversation 
class Message(models.Model): 
(foreignkey very likely) 
    conversation = models.ForeignKey(Conversation, null=True, blank=True) 
    content = models.TextField(db_index=True, max_length=500) 
    created_at = models.DateTimeField(auto_now_add=True) 

Проблема заключается в том, когда я запускаю Юга schemamigration messages --auto или schemamigration conversations --auto, я бегу в ошибку, как это:

class Campaign(models.Model): 
    File "C:\Users\Documents\GitHub\t4s\conversations\models.py", line 11, in Conversation 
    from messages.models import Message 
ImportError: cannot import name Message 

Я считаю, что это потому, что Message и Conversation импортируют друг друга. Но я бы хотел, чтобы каждый экземпляр Message имел связь с Conversation, чтобы я мог ссылаться на название разговора. Есть ли что-то, что я могу сделать, чтобы успешно создать поле Foreignkey в Message и Conversation без изменения структур моделей? Заранее благодарю за ваши ответы!

+1

возможно дубликат [Джанго круговой эталонной модели] (http://stackoverflow.com/questions/8466726/django-circular-model-reference) – NightShadeQueen

+1

(также см документацию здесь: https: //docs.djangoproject .com/ru/dev/ref/models/fields/# foreignkey, esp второй пример) – NightShadeQueen

+0

Измените название своего класса – Gocht

ответ

2

Вы должны использовать строковое значение для ссылки на модели. Однако мне кажется, что обе эти модели должны содержаться в одном приложении. Глядя только на этот бит кода, он чувствует себя плохой дизайн, поскольку приложения не должны иметь такой круглой ссылки.

Также root_message должен быть OneToOneField, поскольку сообщение привязано к одному разговору, что делает невозможным сообщение в качестве корня более чем одного разговора.

class Conversation(models.Model): 
    title = models.CharField('Conversation Title', max_length=500) 
    created_at = models.DateTimeField(auto_now_add=True) 
    composer = models.ForeignKey(User) 
    root_message = models.ForeignKey('messages.Message', null=True, blank=True) 

class Message(models.Model): 
    conversation = models.ForeignKey('conversations.Conversation', null=True, blank=True) 
    content = models.TextField(db_index=True, max_length=500) 
    created_at = models.DateTimeField(auto_now_add=True) 
+0

Спасибо. Использование строкового значения для ссылки на модель решает проблему циклического задания. В определении модели 'Message' я объявил:' campaign = models.ForeignKey ('campaigns.Campaign', null = True, blank = True) '. Спасибо за ответ и предложение еще раз. – user1330974

+0

Пожалуйста, обратите внимание на мои два других предложения. – schillingt

+0

есть. Сделаю. Я думаю, что это упростит конфигурацию модели. Спасибо. :) – user1330974