我有这样的模型:
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),但是我想获取最新的副本,所以我想出了: / p>
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
最高)对象,并在查询书籍时使用它的字段-因此我需要访问它的字段。
答案 0 :(得分:0)
我认为您需要从代码中删除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'))