python - 带有 bool 字段的 Django 查询注释

标签 python django orm django-queryset

假设我有一个 Product 模型,其中包含店面中的产品,以及一个包含产品图像的 ProductImages 表,该表可以包含零个或多个图像。这是一个简化的示例:

class Product(models.Model):
  product_name = models.CharField(max_length=255)
  # ...

class ProductImage(models.Model):
  product = models.ForeignKey(Product, related_name='images')
  image_file = models.CharField(max_length=255)
  # ...

在显示产品的搜索结果时,我想优先考虑具有相关图像的产品。我可以很容易地得到图片的数量:

from django.db.models import Count
Product.objects.annotate(image_count=Count('images'))

但这实际上并不是我想要的。我想用 bool 字段 have_images 对其进行注释,指示产品是否有一张或多张图片,以便我可以按此排序:

Product.objects.annotate(have_images=(?????)).order_by('-have_images', 'product_name')

我该怎么做?谢谢!

最佳答案


我最终找到了一种使用 django 1.8 新的 conditional expressions 的方法。 :

from django.db.models import Case, When, Value, IntegerField
q = (
    Product.objects
           .filter(...)
           .annotate(image_count=Count('images'))
           .annotate(
               have_images=Case(
                   When(image_count__gt=0,
                        then=Value(1)),
                   default=Value(0),
                   output_field=IntegerField()))
           .order_by('-have_images')
)

这就是我最终找到从 1.7 升级到 1.8 的动力的原因。

关于python - 带有 bool 字段的 Django 查询注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31169108/

相关文章:

java - 无法解决 DataAccessException。它是从所需的 .class 文件中间接引用的

java - 在 Hibernate 注释上分配的生成器类

python - 如何使用嵌套循环为函数设置动画?

python - 如何使用图像列表中的标签创建 csv 文件

python - PyObject_GetItem 和 PyObject_SetItem 是否适用于 PyType_List 和 PyType_Dict 类型?

Django-allauth OAuth2 刷新 token

spring - 无法构建 ClassFile - ArchiveException

python - python中的表类数据结构

ajax - Django - 自定义装饰器仅允许 ajax 请求

django - 使用端口转发设置 django 测试服务器