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 1.9中的子查询多对多关系_Django_Python 2.7_Django Queryset - Fatal编程技术网

Django 1.9中的子查询多对多关系

Django 1.9中的子查询多对多关系,django,python-2.7,django-queryset,Django,Python 2.7,Django Queryset,我有这样的模型: 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 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()
我想以这样的方式进行查询:可以有重复项(当最小/最大年龄更改时,新对象将保存到db),但我想得到最新的一个,因此我提出:

class GenreManager(models.Manager):
    def get_latest_genre_obj(self, genre):
        return self.get_queryset().filter(name=genre).latest()
能够找回一个。现在,我想使用上面的
Genre
object获取书籍-我需要查询中的最小和最大年龄值。我试过这样的方法:

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'))
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'))
但看起来我无法将对象注释到其他对象:

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

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

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

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'))
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'))
如果您想要特定类型的书籍:

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):
        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'))
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'))

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

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'))
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'))
如果您想要特定类型的书籍:

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):
        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'))
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'))