Django:查询外键控制对象集的属性

时间:2016-06-23 12:43:14

标签: python django

我正在寻找一种方法来使用Django查询工具返回符合某些条件的对象列表,这些条件可能与一组相关对象有关。这就是我的意思:

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

class Chapter(models.model):
    name = models.CharField(max_length=100)
    book = models.ForeignKey(Book)
    length = models.IntegerField(default=0)

在此查询中,我想要检索每个组件Books都有Chapter的所有length > 100

我意识到我可以做类似的事情:

for book in Book.objects.all():
    for chapter in book.chapter_set.all():
        {do whatever to record if this chapter is valid/invalid}

然而,这显然是接近它的最天真的方式。我确信这是一种避免嵌套for循环的好方法,但我想避免首先迭代每个对象。

有没有办法可以使用各种Django工具来构建利用chapter_set中对象属性的查询?我无法在以这种方式工作的文档中找到任何内容 - 每个示例都使用一个特定实例的_set而不是将其合并为查询。

例如,我认为以下SQL会直接完成我在这里尝试做的事情(直到我稍后再回到我的计算机上,这可能是未经测试的,也许单独的子选择会起作用):

select * from book b, (select book_id 
                       from chapter
                       group by book_id
                       having min(length) = 100 ) x
where b.book_id = x.book_id;

我也试图避免使用原始SQL,所以即使这个(或它的某个版本)有效,我也希望通过找出它将如何转换为更多来了解Django查询功能。 filter()F()Q()等表达式的某种组合。

1 个答案:

答案 0 :(得分:0)

您可以尝试查询所有Book s,但至少有Chapterlength小于或等于100的那些books = Book.objects.exclude(chapter__length__le=100) 。例如:

onPlayerMove