2012-03-07 6 views
2

フォーラムのようなthingyでDjangoアプリケーションを作成しています。ビューの1つにディスカッションのリストが表示され、最後に書かれたポストが表示されます。Djangoでお互いに2つのオブジェクトを取得します

class Discussion(models.Model): 
    <snip> 
    topic = models.CharField(max_length=512) 

class DiscussionPost(models.Model): 
    <snip> 
    target = models.ForeignKey(Discussion) 
    author = models.ForeignKey(User) 
    content = models.TextField(max_length=16000) 
    creation_date = models.DateTimeField(auto_now_add=True) 

標準のDjangoクエリでは、ページあたり50回(ディスカッションごとに1回)フェッチする必要があります。

DiscussionPost.objects 
.filter(target=some_discussion) 
.annotate(last_post=Max('creation_date')) 
.filter(creation_date=F('last_post')) 

私は議論にフィールドlast_post = models.ForeignKey(DiscussionPost, null=True)を追加し、このようDiscussionPostで方法を「保存」変更することで、周囲にこれを仕事にしようとした:

def save(self, *args, **kwargs): 
    if self.pk == None: 
     i_am_new = True 
    else: 
     i_am_new = False 
    super(DiscussionPost, self).save(*args, **kwargs) 
    if i_am_new: 
     self.target.last_post=self 
     self.target.save() 

しかし、これは循環依存関係を作り、簡単にコンパイルされません。

誰もこの問題を解決する方法を知っていますか?あなたの循環依存関係を解決するために簡単そうですが、私はこだわっている...

答えて

1

問題がある:あなたがディスカッションでそれをFKときDiscussionPostはまだ宣言されていません。 まだ宣言されていないモデルの名前を引用符で囲みます。

models.ForeignKey('DiscussionPost', null=True) 

を参照してください:あなたの助けをhttps://stackoverflow.com/a/9606701/884453

+0

感謝:)あなたはそれを書いた後、私はDjangoのドキュメントに何かを発見した[リンク](https://docs.djangoproject.com/en/dev/ref/モデル/フィールド/#再帰的関係)。 – Bugari

関連する問題