从一个不同的领域从向后的外国密钥关系中获得Django Queryset



使用django 1.8

我试图通过向后的外国密钥关系获得一个QuerySet,其中只有一个界字段的一个独特的值。

class Franchise(models.Model):
    ...
class Title(models.Model):
    franchise = models.ForeignKey(Franchise, related_name='titles')
    genre = models.CharField(max_length=20)
    ...

因此,在此示例中,我想获得一个特许对象的QuerySet,所有标题都具有相同的类型。我可以将方法添加到特许经营模型中,并生成特许经营ID的列表获得QuerySet,但这非常慢。

class Franchise(models.Model):
    ...
    def get_title_genres(self):
        self.titles.values_list('genre', flat=True).distinct()
    def is_single_genre(self):
        return len(self.get_title_genres()) == 1

franchise_ids = [
   franchise.id
   for franchise in Franchise.objects.all()
   if franchise.is_single_genre()
]
queryset = Franchise.objects.filter(id__in=franchise_ids)

我可以做到更有效的方法吗?

除非您需要一个QuerySet,否则您无需使用id__in=franchise_ids的第二个QuerySet。

franchises = [
    franchise for franchise in Franchise.objects.all()
    if franchise.is_single_genre()
]

您可以使用prefetch_related使用QuerySet获取所有相关标题,但是您将无法重复使用get_title_genres方法,因为values_list(...).distinct()会触发新的SQL查询。

franchises = [
    franchise for franchise in Franchise.objects.prefetch_related('titles')
    if len(set(t.genre for t in franchise.titles)) == 1
]

最新更新