2013-10-17 184 views
2

可以從django模型進行查詢嗎?Django - 在models.py中過濾QuerySet

我有2種型號:

class Book(models.Model): 
    ... 
    def copies_available(self): 
     pass 

class BookCopy(models.Model): 
    ... 
    book_category = models.ForeignKey(Book, related_name='copies') 
    issued_to = models.ForeignKey(EndUser, related_name='issued_books', null=True, blank=True) 

我想copies_available()返回一份Book,其issued_toBookCopy intances數量None

回答

2

這應該工作:

class Book(models.Model): 
    ... 
    def copied_available(self): 
     return self.copies.filter(issued_to__isnull=True).count() 
+0

由於工作就像一個魅力。 –

-1

是剛剛成立limit_choices_to在ForeignKey。從docs

「查找參數和值的字典(請參閱製作查詢),限制此對象的可用管理員或ModelForm選項。將此與Python日期時間模塊中的函數一起使用,以按日期限制對象的選擇。例如:」

limit_choices_to = {'pub_date__lte': datetime.date.today} 
0

我這樣做一對夫婦幾年前,所以它可能已經改變了一點點:

您需要創建一個BookManager類,並將功能放在那裏。然後,經理分配給您的Book模型的對象變量,就像這樣:

class BookManager(models.Manager): 

    def copied_available(self): 

     queryset = BookCopy.objects.filter(book_category=self.id).filter(issued_to is not None) 

     return queryset.count() 

class Book(models.Model): 
    ... 
    objects = BookManager() 
在你的模板

所以,你可以這樣做:

<p> Copies: {{ thebook.copied_available }}</p> 
+0

您不應該在過濾結果時覆蓋djangos默認模型管理器,否則可能會導致意外結果(https://docs.djangoproject.com/en/dev/topics/db/managers/#writing-correct-managers-for-use -in-自動管理器-實例) – Jingo

相關問題