过滤“;“下游”;Django'中的相关对象;什么是ORM?
是否有一种方法可以过滤类中的相关对象。我说的不是按相关对象过滤,而是在类中过滤相关对象本身。也许一个例子可以更好地说明: 假设我有以下模型:过滤“;“下游”;Django'中的相关对象;什么是ORM?,django,django-models,Django,Django Models,是否有一种方法可以过滤类中的相关对象。我说的不是按相关对象过滤,而是在类中过滤相关对象本身。也许一个例子可以更好地说明: 假设我有以下模型: class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey('Author', null=True) isbn = models.CharField('ISBN',max_length=13) ge
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author', null=True)
isbn = models.CharField('ISBN',max_length=13)
genre = models.ManyToManyField(Genre)
class Genre(models.Model):
name = models.CharField(max_length=200)
...
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
我知道如何进行简单的过滤,比如获取特定类型的所有书籍:
books = Books.objects.filter(genre=1)
然后在视图中循环:
{% for book in books %}
{{book.title}}
{% endfor %}
但是,有没有一种方法可以过滤queryset的相关对象?假设我有一个已经过滤过的作者queryset,我只想列出他在特定流派中的作品:
books = Books.objects.filter(genre=1)
如果我这样做:
{% for book in author.books_set.all %}
{{book.title}}
{% endfor %}
我得到了他所有的书(正如我所期望和想要的)
但是,有没有办法做到这一点:
{% for book in author.books_set.filter(genre=1) %}
{{book.title}}
{% endfor %}
所以我只得到一个相关对象的过滤列表
我更喜欢在视图中或作为类方法来执行此操作,因为我不喜欢在模板中混合逻辑
i、 e:
但是,我似乎无法找到最好的、最具pythonic(或djangonic:)的方法来做到这一点
我知道我可以在视图中“构建”数据结构,方法是循环各种查询集并构建我想要的内容,但我希望保留已经定义的数据模型和关系
你对我想要完成的事情有什么想法吗?或者我可以更好地详细说明我正在尝试做什么
谢谢 您可以在
手册
模型上的查询集中应用或连接多个筛选器:
books = Books.objects.filter(author='Bob', genre=1)
或
或者-如果要查询相关对象-可以使用以下方法:
您可以在
手册
模型上的查询集中应用或连接多个筛选器:
books = Books.objects.filter(author='Bob', genre=1)
或
或者-如果要查询相关对象-可以使用以下方法:
@多鲁:
我无法让它工作,因为
auths = Author.objects.filter(author='Bob').prefetch_related(book__genre=1)
TypeError: prefetch_related() got an unexpected keyword argument 'book__genre'
但是,你让我走上了正确的道路!!我在文档中找到了预取方法。这就是我所做的,并让它按照我的需要工作:
auths = Author.objects.filter(author='Bob').prefetch_related(Prefetch('book_set', queryset=Book.objects.filter(genre=3), to_attr='filtered_books'))
然后在模板中使用以下内容:
{% for book in author.filtered_books %}
{{book.title}}
{% endfor %}
所以,谢谢你让我走上了正确的道路 @Doru:
我无法让它工作,因为
auths = Author.objects.filter(author='Bob').prefetch_related(book__genre=1)
TypeError: prefetch_related() got an unexpected keyword argument 'book__genre'
但是,你让我走上了正确的道路!!我在文档中找到了预取方法。这就是我所做的,并让它按照我的需要工作:
auths = Author.objects.filter(author='Bob').prefetch_related(Prefetch('book_set', queryset=Book.objects.filter(genre=3), to_attr='filtered_books'))
然后在模板中使用以下内容:
{% for book in author.filtered_books %}
{{book.title}}
{% endfor %}
所以,谢谢你让我走上了正确的道路