Я ищу чистый способ конвертировать один тип 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 и фильтровать поля родителя, используя обратный поиск, но это не поддерживает все, что вы можете сделать в основной модели.