2015-04-17 3 views
0

Вот моя модельКак изменить внешний ключ ссылки в модели Django?

class Comment (models.Model): 
    parent = models.ForeignKey('Comment', 
          related_name='children', 
          null=True) 
    text = models.TextField(blank=True) 

    def __repr__(self): 
     return self.text 

class Thread(models.Model): 
    comment = models.ForeignKey('Comment', related_name='parent_thread', null=True) 
    text = models.TextField(blank=True) 

    def __repr__(self): 
     return self.text 

Когда я пытаюсь установить замечание потока на комментарий, например комментарий не получить обращенные связанный (я не могу получить доступ к полю related_name от комментария экземпляра)

from tree.models import Comment, Thread 
thread1 = Thread(text='thread1') 
c1 = Comment(text='c1') 
c1.save() 
thread1.save() 
thread1.comment = c1 
thread1.save() 
str(c1.parent_thread) # return None 

Почему это происходит? Кто-нибудь может мне помочь?

Thanks

+0

Вы имеете в виду c1.parent вместо parent_thread? Django, скорее всего, кэшировал комментарий перед обновлением потока, и поэтому вам нужно перечитать его из базы данных для обновления кеша. – Ben

+0

спасибо, но я имел в виду 'c1.parent_thread', я бы хотел, чтобы экземпляр' comment' обращался к 'thread' с помощью' parent_thread', используя related_name – Kevin

ответ

1

Вы делаете это назад. Если вы хотите иметь parent_thread, вы должны поставить ForeignKey в Comment класса, а не наоборот, как это:

class Thread(models.Model): 
    ... 

class Comment (models.Model): 
    parent_thread = models.ForeignKey(Thread) 
    ... 

В текущем коде у вас есть несколькоThread объекты, связанные с одной Comment объекта.

+0

, но я хотел бы иметь двойную связанную связь, так что 'comment' может получить доступ к' thread 'by' parent_parent' и 'thread' могут получить доступ к' comment' by 'comment' – Kevin

+0

Ваши модели не отражают того, что вы говорите. Вы не можете пересечь отношение «один ко многим». Вы можете получить все связанные потоки только с помощью 'c1.thread_set.all()'. – Selcuk

Смежные вопросы