在 Django 查询集中使用注解
Working with annotation in Django queryset
我需要 Django 注释方面的帮助。
我有一个名为 Photo
的 Django 数据模型,另一个名为 PhotoStream
(一个 PhotoStream 可以有很多照片 - 最后是详细模型)。我只需通过以下方式即可获得最新的 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]
给出一个无效的语法错误。
虽然以下有效,但不符合我在上面 (ii) 中与时间戳相关的要求:
Photo.objects.order_by('-id').annotate(num_related_photos=Count('which_stream__photo'))[:200]
我将查询分解如下:
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 的方式而起作用。这里有很好的解释:
我需要 Django 注释方面的帮助。
我有一个名为 Photo
的 Django 数据模型,另一个名为 PhotoStream
(一个 PhotoStream 可以有很多照片 - 最后是详细模型)。我只需通过以下方式即可获得最新的 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]
给出一个无效的语法错误。
虽然以下有效,但不符合我在上面 (ii) 中与时间戳相关的要求:
Photo.objects.order_by('-id').annotate(num_related_photos=Count('which_stream__photo'))[:200]
我将查询分解如下:
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 的方式而起作用。这里有很好的解释: