2016-04-23 88 views
0

我需要Django註釋幫助。我有一個叫做Photo的Django數據模型,另一個叫PhotoStream(一個PhotoStream最後可以有很多照片 - 詳細模型)。我通過以下方式獲取最新的200張照片:Photo.objects.order_by('-id')[:200]在Django查詢集中使用註釋

對於上述查詢集中的每個對象,我想註釋所有相關照片的計數。相關照片是(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] 

給出一個無效的語法錯誤。

而下面的作品,但不迎合我的時間戳相關要求(ii)項:

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