【问题标题】:Subquery many-to-many relation in Django 1.9Django 1.9中的子查询多对多关系
【发布时间】:2019-08-10 19:47:48
【问题描述】:

我有这样的模型:

class Genre(models.Model):
    name = models.TextField(null=True, blank=True)
    min_age = models.IntegerField(default=0)
    max_age = models.IntegerField(default=0)
    objects = GenreManager()

    class Meta:
        get_latest_by = 'id'


class Book(models.Model):
    name = models.TextField(null=True, blank=True)
    genres = models.ManyToManyField(Genre, related_name='genres')
    suggested_age = models.IntegerField(default=0)
    objects = BookManager()

我想用这样的方式查询它:可能有重复(当最小/最大年龄改变时,新对象将被保存到数据库),但我想得到最新的,所以我想出了:

class GenreManager(models.Manager):
    def get_latest_genre_obj(self, genre):
        return self.get_queryset().filter(name=genre).latest()

能够检索到一个。现在,我想使用上面的Genre 对象来获取书籍——我需要查询中的最小和最大年龄值。我尝试过这样的事情:

class BookManager(models.Manager):
    def get_books_from_genre(self, genre):
        genre = Genre.objects.get_latest_genre_obj(genre)
        return self.get_queryset().annotate(actual_genre=genre).filter(actual_genre__min_age__gte=F('suggested_age'), actual_genre__max_age__lte=F('suggested_age'))

但看起来我无法将对象注释到其他对象:

AttributeError: 'Genre' object has no attribute 'resolve_expression'

那么,如何像我想要的那样查询它?我想到了Subquery(),因为我认为它可以帮助我,但它是 Django 1.11 的功能,我使用的是 1.9 版本。总结一下我想要实现的目标:从流派中检索具有特定名称的最新(最高 id)对象,并在查询书籍时使用它的字段 - 所以我需要访问它的字段。

【问题讨论】:

    标签: django python-2.7 django-queryset


    【解决方案1】:

    我认为您需要从代码中删除annotate,并像这样使用它:

    如果您想要特定类型的书籍:

    class BookManager(models.Manager):
        def get_books_from_genre(self, genre):
            genre_object = Genre.objects.get_latest_genre_obj(genre)
            return self.get_queryset().filter(genres=genre_object)
    

    现在,如果您想拥有同名的多种类型的书籍,那么您可以这样尝试:

    class BookManager(models.Manager):
        def get_books_from_genre(self, genre):
            return self.get_queryset().filter(genres__name=genre, genres__min_age__gte=F('suggested_age'), genres__max_age__lte=F('suggested_age'))
    

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2014-07-14
      相关资源
      最近更新 更多