ユーザーが写真をアップロードしてコメントを残すDjangoアプリがあります。これらのオブジェクトを反映するデータモデルは、それぞれPhoto
とPhotoComment
です。Djangoクエリーセット関連の比較を最適化する
PhotoThreadSubscription
という3番目のデータモデルがあります。ユーザーが写真の下でコメントするたびに、ユーザーはPhotoThreadSubscription
にオブジェクトを作成することによってその特定のスレッドにサブスクライブされます。このようにして、後で他のユーザーが同じスレッドに残したコメントを知ることができます。
class PhotoThreadSubscription(models.Model):
viewer = models.ForeignKey(User)
viewed_at = models.DateTimeField(db_index=True)
which_photo = models.ForeignKey(Photo)
写真の下のユーザーがコメントするたびに、私は、その特定の写真のためのユーザのPhotoThreadSubscription
オブジェクトのviewed_at
属性を更新します。 他のユーザーの投稿は、その特定のスレッドの投稿時間がviewed_at
より大きいので、新しいです。
私はコメントのクエリーセットを持っているとします。これらのコメントは、決して繰り返されないユニークな写真に属しています。私はこのクエリーセットを横断して、最新の見えないコメントを探しています。
現在、私は非常に重いDB方法でこれをしようとしている:
latest_unseen_comment = PhotoComment(id=1) #i.e. a very old comment
for comment in comments:
if comment.submitted_on > PhotoThreadSubscription.objects.get(viewer=user, which_photo_id=comment.which_photo_id).viewed_at and comment.submitted_on > latest_unseen_comment.submitted_on:
latest_unseen_comment = comment
これは明らかにそれを行うには良い方法ではありません。 1つは、forループでDB呼び出しをしたくないということです。 1回のコールで上記をどのように管理できますか?具体的には、1回の呼び出しで適切なPhotoThreadSubscription
クエリーセットを取得するにはどうすればいいですか?次に、それを使ってmax_unseen_commentを計算するにはどうすればよいですか?私は今非常に混乱しています。
class Photo(models.Model):
owner = models.ForeignKey(User)
image_file = models.ImageField(upload_to=upload_photo_to_location, storage=OverwriteStorage())
upload_time = models.DateTimeField(auto_now_add=True, db_index=True)
latest_comment = models.ForeignKey(blank=True, null=True, on_delete=models.CASCADE)
class PhotoComment(models.Model):
which_photo = models.ForeignKey(Photo)
text = models.TextField(validators=[MaxLengthValidator(250)])
submitted_by = models.ForeignKey(User)
submitted_on = models.DateTimeField(auto_now_add=True)
質問がかすんで見えた場合明確化のためにお問い合わせください。私は、これは単一のクエリでそれを行うだろうと思い