2016-04-23 7 views
0

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ループを変換するために見えることはできません。どんな助け?


ここでは、関連する分野でphotophotostreamデータモデルです:

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] 

答えて

0

Photo.objects.filter(which_stream__photo__upload_time__lte=F('upload_time')).annotate(num_related_photos=Count('which_stream__photo')).order_by('-id')[:200] 

それはカウンターに見えます直観的ではありませんが、基本SQLを作成する方法のために機能します。良い説明はこちらhttps://stackoverflow.com/a/7001419/4936905

関連する問題