Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
过滤“;“下游”;Django'中的相关对象;什么是ORM?_Django_Django Models - Fatal编程技术网

过滤“;“下游”;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 %}
所以,谢谢你让我走上了正确的道路