Django ORM комментирует продукты с оценками клиентов

Рассмотрим следующую модель Джанго

Customer(models.Model)
    name = models.CharField()

Product(models.Model)
    name = models.CharField()

Score(models.Model)
    points = models.IntegerField()
    customer = models.ForeignKey(Customer)
    product = models.ForeignKey(Product)

Я хотел бы получить список всех продуктов с пометкой:

  • общий балл от всех клиентов
  • оценка только от текущего клиента

Я смог заставить его работать на общий счет, как это:

products = Product.objects.annotate(total_points = Sum('score__points')).all()

но я не знаю, как добавить аннотацию только с текущей оценкой клиента (если клиент ознакомился с продуктом, в противном случае - Нет). Я хочу что-то вроде этого:

cus = Cusomter.objects.get(pk=123)
products = Product.objects.annotate(total_points = Sum('score__points'),\
                                    current_customer_points= (Score.points where customer=cus and product = this).all()

1 ответ

ids = SortedDict()
for p in Product.objects.annotate(total=Sum('score__points')):
    ids[p.pk] = p

for score in Score.objects.filter(customer_id=1, product__in=ids.keys()):
    ids[score.product_id].customer_score = score

for p in ids.values():
    print p.total, '/', p.customer_score.points if hasattr(p, 'customer_score') else '-'
Другие вопросы по тегам