从具有一个不同字段的向后外键关系获取Django查询集

时间:2019-05-09 13:38:19

标签: python django django-models django-queryset django-1.8

使用Django 1.8

我正在尝试通过向后外键关系获取查询集,在该关系中,源模型中的字段只有一个不同的值。

class Franchise(models.Model):
    ...

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

因此,在此示例中,我想获得一个Franchise对象的查询集,其所有标题都具有相同的体裁。我可以向Franchise模型中添加方法,并生成一个专营ID的列表以获得一个查询集,但这非常慢。

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)

有没有更有效的方法?

1 个答案:

答案 0 :(得分:1)

除非需要查询集,否则不需要使用id__in=franchise_ids的第二个查询集。

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

您可以使用prefetch_related来获取与查询集相关的所有标题,但是您将无法重用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
]
相关问题