Я слил два querysets (qs1 и QS2), которые по отдельности работают нормально, следующим образом:Использование аннотата или добавочного поля для добавления в поле foreignkey к запросу? (Эквивалент SQL "AS"?)
qlist = [qs1, qs2]
results = list(chain(qs1, qs2))
До сих пор, так хорошо - вышеуказанные работы. Но теперь я пытаюсь упорядочить результаты, используя следующие:
qlist = [qs1, qs2]
results = sorted(chain(qs1, qs2), key=attrgetter('monthly_fee'))
Проблема заключается в том, что второй QuerySet (QS2) относится к monthly_fee через ForeignKey; в то время как qs1 имеет доступность «month_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(), чтобы переименовать subscription__monthly_fee
в Qs2 запроса следующим образом:
qs2 = Offer.objects.select_related('subscription').annotate(monthly_fee=subscription__monthly_fee)
Но затем получить ошибку
global name 'subscription__monthly_fee' is not defined
Я нахожусь только в том, чтобы просто взломать это, переопределив методы .save() моих моделей, чтобы вручную добавлять month_fee к каждому экземпляру предложения всякий раз, когда создается объект. Но просто хотел проверить, нет ли лучшего способа?
Спасибо,
Майкл
Thanks Mark. Раньше не использовались выражения F. Попробовал добавить это, но получил следующую ошибку: объект «F» не имеет атрибута «lookup» –
Возможно, это было исправлено в Django 1.8. См. Документы: «Вы также можете использовать двойное обозначение подчеркивания для связи между объектами F()» (https://docs.djangoproject.com/en/1.8/topics/db/queries/#using-f-expressions -в-фильтры). – interDist