【发布时间】: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