【问题标题】:Working with annotation in Django queryset在 Django 查询集中使用注释
【发布时间】:2016-08-17 11:02:56
【问题描述】:

我需要 Django 注释方面的帮助。

我有一个名为 Photo 的 Django 数据模型,还有一个名为 PhotoStream 的 Django 数据模型(一个 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 循环转换为查询集注释。有什么帮助吗?


这是具有相关字段的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]

【问题讨论】:

    标签: django django-models django-views django-orm


    【解决方案1】:

    我将查询分解如下:

    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

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2023-03-27
      • 2020-05-14
      相关资源
      最近更新 更多