Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
Python 从具有一个不同字段的向后外键关系获取django查询集_Python_Django_Django Models_Django Queryset_Django 1.8 - Fatal编程技术网

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

Python 从具有一个不同字段的向后外键关系获取django查询集,python,django,django-models,django-queryset,django-1.8,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) ... 所以在这个例子中,我想得

使用Django 1.8

我试图通过向后外键关系获得查询集,其中源模型中的一个字段只有一个不同的值

class Franchise(models.Model):
    ...

class Title(models.Model):
    franchise = models.ForeignKey(Franchise, related_name='titles')
    genre = models.CharField(max_length=20)
    ...
所以在这个例子中,我想得到一个特许经营对象的查询集,其中所有的标题都具有相同的类型。我可以向特许经营模型中添加方法,并生成特许经营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)

有更有效的方法吗?

除非您需要查询集,否则您不需要使用
id\uuuu-in=francement\u-id
进行第二个查询集

franchises = [
    franchise for franchise in Franchise.objects.all()
    if franchise.is_single_genre()
]
您可以使用
prefetch\u related
通过queryset获取所有相关的标题,但是您将无法重用
get\u title\u genres
方法,因为
values\u list(…).distinct()
将触发新的SQL查询

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

请注意,Django 1.8已经过期,一年多没有收到安全更新。