【问题标题】:Custom filter for Django querysetsDjango 查询集的自定义过滤器
【发布时间】:2016-09-11 14:48:14
【问题描述】:

您好,我有一个问题:我有一个包含一些字段的模型。

class Gallery(models.Model):
    image = models.FileField(upload_to='gallery/')
    status = models.BooleanField()
    type = models.BooleanField()

我使用此模型将画廊图像存储在砖石网格中。这个网格是固定的,我需要得到 12 个随机图像,这很容易做到。

gallery = Gallery.objects.all().order_by('id','pk').order_by('?')[: 12];

但是其中 5 个应该是 True 类型,另外 7 个应该是 False。如果它能够在这个查询集中自定义一个顺序,我会非常高兴,例如,True 表示水平图片(h),False - 垂直 [v]。我想得到这样的订单 [v,h,h,h,v,v,v,h,h,v,v,v]

【问题讨论】:

  • 我不确定这是否是您需要的;但是first getting 5 random True type, then getting 7 random False type and combine these two query results呢?

标签: python django django-queryset django-orm


【解决方案1】:

您可以进行两种查询,一种用于水平对象,另一种用于垂直对象。

horizontal = Gallery.objects.filter(type=True).order_by('?')[:7]
vertical = Gallery.objects.filter(type=False).order_by('?')[:5]

然后从你的两个查询集构造列表

gallery = [verical[0]] + horizontal[0:3] + vertical[1:4] + horizontal[3:] + vertical[4:]

请注意order_by docs 警告order_by('?') 可能会很慢。如果遇到性能问题,您可能需要寻找替代方法。例如,请参阅this question

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 2018-09-29
    • 2016-06-12
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2021-03-23
    相关资源
    最近更新 更多