2013-10-17 183 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

相关问题