【问题标题】:Sub-query to make use of different distinct & orderby子查询利用不同的 distinct 和 orderby
【发布时间】:2016-09-11 19:12:45
【问题描述】:

我需要使用不同的 order_by 和不同的值,我已经尝试使用子查询。

我怎样才能做到这一点?

能否通过 qset 选择我想要的产品,然后在单独的查询中选择您要显示其价格的 15 个变体?

换句话说:Qset 随机选择产品 ID(在查询集中),然后 python 告诉它返回仅包含这 15 个项目的查询集。

加快查询速度也很重要——因为它需要大约 800 毫秒(当我 order_by pk 时)或 5.8 秒当我使用 order_by '?' 时。

我的尝试:

    distinct_qs = (
        Product.objects
        .distinct('id')
    )

    qset = (
        Product.objects
        .filter(pk__in=distinct_qs)
        .order_by('rating', '?')
        .values('name', 'image',)
        .annotate(
            price=F('variation__price__price'),
            id=F('pk'),
            vari=F('variation'),
        )[:15]
    )

输出数据样本:

{"name":"Test Item","vari":10, id":1, "price":"80", "image":"xyz.com/1.jpg"},
{"name":"Test Item","vari":11, id":1, "price":"80", "image":"xyz.com/1.jpg"},
{"name":"Another one","vari":14, id":2, "price":"10", "image":"xyz.com/2.jpg"},
{"name":"Another one","vari":15, id":2, "price":"10", "image":"xyz.com/2.jpg"},
{"name":"And Again","vari":17, id":3, "price":"12", "image":"xyz.com/3.jpg"},
{"name":"And Again","vari":18, id":3, "price":"12", "image":"xyz.com/3.jpg"},

所需的输出数据:

{"name":"Test Item","vari":13, id":1, "price":"80", "image":"xyz.com/1.jpg"},
{"name":"Another one","vari":14, id":2, "price":"10", "image":"xyz.com/2.jpg"},
{"name":"And Again","vari":17, id":3, "price":"12", "image":"xyz.com/3.jpg"},

models.py 示例

class Product(models.Model):
    name = models.CharField ("Name", max_length=400)
    ...

class Variation(models.Model):
    product = models.ForeignKey(Product, db_index=True, blank=False, null=False)
    ...

class Image(models.Model):
    variation = models.ForeignKey(Variation, blank=False, null=False)
    image = models.URLField(max_length=540, blank=True, null=True)


class Price(models.Model):
    price = models.DecimalField("Price", decimal_places=2, max_digits=10)
    variation = models.ForeignKey(Variation, blank=False, null=False)

【问题讨论】:

  • 请包括数据库模式、示例数据和期望输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • 我已添加到我的问题中。谢谢
  • 我没有在 python 中工作,但在 sql 中你可以使用 Row_number() 函数。使用这个函数你可以在over子句中指定行号的顺序。
  • 请举个例子
  • 根据您的型号,一个变体可以有多个图像/价格。这是故意的吗?如果是,那么您希望产品用什么注释?因为,如果变量有多个价格,那么您的产品将获得所有这些价格的注释。

标签: python sql django postgresql django-rest-framework


【解决方案1】:

我认为您应该编写一个自定义模型管理器(请参阅 https://docs.djangoproject.com/en/1.9/topics/db/managers/ )并在那里创建一个方法,然后您将使用该方法返回变体而不是标准查询。

对于随机化,您可以这样做: 选择 Variation(或 Product)的最后一个 id,然后从该间隔生成不同的随机 15 个 id,然后从数据库中提取具有这些 id 的对象。我认为它应该工作得更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多