2014-02-07 3 views
0

Рассмотрим следующую модель DjangoDjango 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() 

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

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() 

ответ

0
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 '-' 
Смежные вопросы