Djangoアノテーションで助けが必要です。Djangoクエリーセットでアノテーションを操作する
私はPhoto
と呼ばれるDjangoデータモデルを持っています。もう1つはPhotoStream
と呼ばれています(1つのPhotoStreamは多くのPhotos - 詳細なモデルを最後に持つことができます)。私は最新の200枚の写真を以下の方法で入手します:Photo.objects.order_by('-id')[:200]
上記のクエリーセットのすべてのオブジェクトに、のすべての関連写真を注釈したいと思います。関連する写真は、(i)同一のPhotoStreamから、(ii)タイムスタンプが問題のオブジェクトのタイムスタンプ以下である写真です。言い換えれば
:
for obj in context["object_list"]:
count = Photo.objects.filter(which_stream=obj.which_stream).order_by('-upload_time').exclude(upload_time__gt=obj.upload_time).count()
私はこれに新たなんだ、とクエリセット注釈に上記のforループを変換するために見えることはできません。どんな助け?
ここでは、関連する分野でphoto
とphotostream
データモデルです:
class Photo(models.Model):
owner = models.ForeignKey(User)
which_stream = models.ForeignKey(PhotoStream)
image_file = models.ImageField(upload_to=upload_photo_to_location, storage=OverwriteStorage())
upload_time = models.DateTimeField(auto_now_add=True, db_index=True)
class PhotoStream(models.Model):
stream_cover = models.ForeignKey(Photo)
children_count = models.IntegerField(default=1)
creation_time = models.DateTimeField(auto_now_add=True)
は、これまでのところ私の試みがされています:
Photo.objects.order_by('-id').annotate(num_related_photos=Count('which_stream__photo__upload_time__lte=F('upload_time')))[:200]
は、無効な構文エラーを与えます。以下の作品のに対し
が、上記(ⅱ)に私のタイムスタンプ関連の要求に応えるません。次のように私は、クエリを決裂
Photo.objects.order_by('-id').annotate(num_related_photos=Count('which_stream__photo'))[:200]