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()
しかし、これは循環依存関係を作り、簡単にコンパイルされません。
誰もこの問題を解決する方法を知っていますか?あなたの循環依存関係を解決するために簡単そうですが、私はこだわっている...
感謝:)あなたはそれを書いた後、私はDjangoのドキュメントに何かを発見した[リンク](https://docs.djangoproject.com/en/dev/ref/モデル/フィールド/#再帰的関係)。 – Bugari