2010-05-18 4 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

+0

Что вы имеете в виду? Это «Django-y» способ и оптимальный, так как вы должны запрашивать только счет. +1 –

+0

Да, «Django-y» - это плохой срок ... Полагаю, я пытался найти какой-то метод API django, который позволил бы мне сделать это за один раз. – Brant

1

Я не уверен, что ваше возражение на путь Хасан написал, но, возможно, - на основе вашего «двойной хит базы данных» комментарий - вы ищете способ проверки всех экземпляров Шелфа сразу? Если да, то вы можете сделать это с аннотациями:

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

Это дает вам список всех полок, по меньшей мере, одну книгу.

+0

У меня на самом деле нет проблем с ним. Это был скорее исследовательский вопрос ... Мне просто интересно, есть ли способ сделать это за один раз. Благодарю. – Brant

Смежные вопросы