2016-12-07 3 views
3

Я ищу чистый способ конвертировать один тип QuerySet в другой, основанный на моделях ForeignKey, поэтому в основном что-то вроде .values_list('my_fk', flat=True), но возвращает правильный QuerySet вместо варианта values_list().Django .values_list() альтернатива, которая возвращает QuerySet для модели поля ForeignKey?

Например:

class Parent(models.Model): 
    child = models.ForeignKey(Child) 
    ... 

children_qs = Parent.objects.filter(...).theMagicMethod('child') 

Здесь children_qs должен теперь быть QuerySet для всех случаев ребенка, используемых в предыдущем запросе, вместо родительского экземпляра QuerySet возвращения.

Вы можете сортировать сделать это с помощью пользовательского QuerySet и __in поиска, но он чувствует себя немного вонючий:

class ParentQuerySet(models.QuerySet): 
    ... 
    def children(self): 
     return Child.objects.filter(id__in=self.values_list('child_id', flat=True)) 

Это занимает все child_id FK от записей в QuerySet Родитель и повторно-запрос ребенка непосредственно. Когда я проверяю SQL, он выполняет вспомогательный запрос, и я не уверен, что это оптимально или имеет некоторые странные побочные эффекты. Это похоже на то, что заказ из исходного родительского запроса ушел, а также дубликаты.

У кого-нибудь есть что-то лучше, чем это?

примечание: я знаю, что я мог бы запрашивать непосредственно через Child и фильтровать поля родителя, используя обратный поиск, но это не поддерживает все, что вы можете сделать в основной модели.

ответ

2

Попробуйте это, он будет возвращать query_set класса Child

parent_primary_keys = Parent.objects.filter(...).values_list('pk',flat=True) 

children_qs = Child.objects.filter(id__in=parent_primary_keys)