2010-05-18 22 views
0

下面是一對簡單的關係模型。Django - 更好地評估模型級別的關係

class Shelf(models.Model): 
    name = models.CharField(max_length=100) 

    def has_books(self): 
    if Book.objects.filter(shelf=self): 
     return True 
    else: 
     return False 

class Book(models.Model): 
    shelf = models.ForeignKey(Shelf) 
    name = models.CharField(max_length=100) 

是否有更好的(或可選的)方法來編寫「has_book」方法?

我不是雙數據庫命中的粉絲,但我想在模型級別執行此操作。

回答

3

你可以這樣做:

def has_books(self): 
    return self.book_set.all().count() > 0 
+1

我想我正在尋找更多花哨的「Django-y」方式來處理交叉模型檢查... – Brant 2010-05-18 17:34:33

+0

你是什麼意思?這是一種「Django-y」方法,因爲您應該只查詢計數。 +1 – 2010-05-18 19:25:05

+0

是的,「Django-y」是一個不好的名詞...我想我正在試圖找到一些django API方法,它可以讓我在一次打擊中完成它。 – Brant 2010-05-19 13:16:50

1

我不知道你的異議是哈桑寫它的方式是什麼,但也許 - 根據您的「雙重打擊數據庫」的評論 - 你正在尋找一次檢查所有Shelf實例的方法?如果是這樣,你可以使用註釋:

from django.db.models import Count 
Book.objects.all().annotate(num_books=Count('book')).filter(num_books__gt=0) 

這給你一個至少有一本書的書架清單。

+0

我真的沒有問題。這更多的是一個探索性問題......我只是想知道是否有一種方法可以在一次打擊中完成。謝謝。 – Brant 2010-05-19 13:15:58