2015-08-06 32 views
5

Ben ı Aşağıdaki 3 modelleri var diyelim yeniAçıklamalar orm

ilgili sorunlar yaşıyorum:

class Author(models.Model): 
    name = models.TextField() 

class Book(models.Model): 
    author = models.ForeignKey(Author, related_name='books') 
    title = models.TextField() 
    is_fiction = models.BooleanField() 

class SpeakingEvent(models.Model): 
    author = models.ForeignKey(Author, related_name='events') 
    date = models.DateField() 

Ve açıklamalı Yazarlar tek Sorgu Kümesi almak istedim yayınlanan kurgu kitaplarının sayısı ve gelecekteki konuşma olaylarının sayısı ile.

Yani, aşağıdakileri yapabilirsiniz:

Author.objects.all().annotate(
    future_speaking=Sum(Case(
     When(events__date__gte=timezone.now(), 
      then=1), 
     default=0)), 
    fiction_count=Sum(Case(
     When(books__is_fiction=True, 
      then=1), 
     default=0)), 
) 

Ancak, ortaya çıkan rakamlar çok yüksek. Eğer m kitap ve n olayları varsa, o zaman kitap sayısı için <correct_result> * n olay sayısı için <correct_result> * m sonucunu bitiririz. Bu, django'nun iki tabloyu bir sol birleştirmeyle birleştirmesi nedeniyle oluşur. Ek açıklamalardan birini bırakırsam sonuçlar doğrudur.

Birleştirmelerde değişiklik yapmak için herhangi bir yol var mı?

+1

Bu, bu gibi görünüyor. Ne yazık ki benim durumum sadece Count() ile sınırlı değil, ama ben geldiğim bir geçici çözüm ekleyeceğim – JeffS

cevap

1

Yaptığım şey temel olarak bununla birlikte saymak ve kodda bölmek. https://docs.djangoproject.com/en/1.8/topics/db/aggregation/#combining-multiple-aggregations bu kadar kafa yetiştirme:

Author.objects.all().annotate(
future_speaking_divide_count=Count('events'), 
future_speaking=Sum(Case(
    When(events__date__gte=timezone.now(), 
     then=1), 
    default=0)), 
fiction_count=Sum(Case(
    When(books__is_fiction=True, 
     then=1), 
    default=0)), 
fiction_count=Count('books') 
)