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 '-'