【发布时间】:2015-11-03 04:12:07
【问题描述】:
我已经合并了两个单独工作的查询集(qs1 和 qs2),如下所示:
qlist = [qs1, qs2]
results = list(chain(qs1, qs2))
到目前为止,一切都很好 - 以上工作。但现在我正在尝试使用以下命令对结果进行排序:
qlist = [qs1, qs2]
results = sorted(chain(qs1, qs2), key=attrgetter('monthly_fee'))
问题是第二个查询集(qs2)通过ForeignKey引用monthly_fee;而 qs1 有 'monthly_fee' 可用。这是qs2:
qs2 = Offer.objects.select_related('subscription')
qs2 = qs2.order_by(subscription__monthly_fee)
以及简化模型:
class Subscription(models.Model):
monthly_fee = models.IntegerField(null=False, blank=True, default=0)
name = models.CharField(max_length=120, null=True, blank=True)
class Offer(models.Model):
promotion_name = models.CharField(max_length=120, null=True, blank=True)
subscription = models.ForeignKey(Subscription)
discount = models.IntegerField(null=False, blank=True, default=0)
我尝试使用 .annotate() 和 .extra() 在查询 qs2 中重命名subscription__monthly_fee,如下所示:
qs2 = Offer.objects.select_related('subscription').annotate(monthly_fee=subscription__monthly_fee)
然后得到错误
全局名称“订阅__monthly_fee”未定义
我只是通过重写模型的 .save() 方法来破解这个问题,以便在创建对象时手动将monthly_fee 添加到每个 Offer 实例。但只是想检查是否有更好的方法?
谢谢你,
迈克尔
【问题讨论】:
标签: python django django-queryset django-orm