2015-02-09 55 views
1

考慮以下車型的不同數量:Django的計算相關的示範

class Publisher(models.Model): 
    name = models.CharField(max_length=300) 
    num_awards = models.IntegerField() 

class Book(models.Model): 
    name = models.CharField(max_length=300) 
    pages = models.IntegerField() 
    publisher = models.ForeignKey(Publisher, related_name='related_books') 

Publisher比如我怎樣才能得到書的數量由不同的價值上pages場?例如:

| name  | pages | publisher | 
|-----------|-------|-----------| 
| Golden | 20 | 1   | 
| Grey  | 23 | 1   | 
| Blue  | 20 | 1   | 
| Grotesque | 27 | 2   | 

如果我有publisher = Publisher.objects.get(id=1)我怎麼能做到這樣的事:

# equals to 2 [Golden, Grey] 
publisher.related_books.all().distinct('pages').count() 
+0

所以,「等於2金,藍」是預期的輸出? – ppalacios 2015-02-09 00:20:52

+0

@PabloPalácios,抱歉,我的意思是金色和灰色。修復。 – norbertpy 2015-02-09 00:21:47

+0

其實現在事情變得更糟了。你想知道有多少書與不同的網頁?我的意思是,爲什麼灰色應該返回2? – ppalacios 2015-02-09 00:31:16

回答

2

你被關閉,你只需要restrict returned values,像這樣:

publisher.related_books.all().values('pages').distinct('pages').count() 

這隻會爲發佈商提供不同頁面長度的數量,但不會爲每個頁面長度提供相關書籍。要做到這一點,你可能需要一個額外的查詢。

+0

謝謝。正是我在找什麼。 – norbertpy 2015-02-09 00:41:33

2

如果你想重複使用的查詢,你可以這樣做:

class BookQuerySet(models.QuerySet): 

    def by_publisher(self, publisher): 
     return self.filter(publisher=publisher) 

    def distinct_number_of_pages(self): 
     return self.distinct(pages) 

class Book(...): 
    ... 
    objects = BookQuerySet.as_manager() 


class Publisher(...): 

    @property 
    def number_of_page_lengths(self): 
     return Book.objects.by_publisher(self).distinct_number_of_pages().count()