python - 返回 ForeignKey 字段模型的 QuerySet 的 Django .values_list() 替代方案?

标签 python django django-queryset

我正在寻找一种基于模型 ForeignKey 字段将一种类型的 QuerySet 转换为另一种类型的 QuerySet 的干净方法,所以基本上类似于 .values_list('my_fk', flat=True) 但是返回正确的 QuerySet 而不是 values_list() 变体。

例如:

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

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

此处 children_qs 现在应该是先前查询中使用的所有子实例的查询集,而不是返回父实例的查询集。

您可以使用自定义查询集和 __in 查找来执行此操作,但感觉有点臭:

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

这从 Parent 的查询集中的记录中获取所有 child_id FK,并直接重新查询 Child。当我检查 SQL 时,它会执行一个子查询,但我不确定这是否是最佳的或有一些奇怪的副作用。看起来原始父查询中的排序确实消失了,重复项也消失了。

还有比这更好的吗?

注意:我知道我可以直接通过 Child 查询并使用反向查找过滤 Parent 的字段,但这并不支持您在主模型上可以执行的所有操作。

最佳答案

试试这个,它会返回子类的query_set

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

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

关于python - 返回 ForeignKey 字段模型的 QuerySet 的 Django .values_list() 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019099/

相关文章:

PythonAnyWhere SECRET_KEY 设置不能为空

django - 避免在不使用 raise Exception 的情况下将实例保存在 pre_save 信号中

python - 在 pdb 中打印替代数字表示

Python脚本通过FTP上传文件

python - 当 html 源中使用类似的类时,使用特定标准进行抓取

jquery - 如何在 django 框架中使用 jqGrid

Django Querysets - 按相关对象中的 bool 值过滤对象

python - 在 Django select_lated 中遵循foreignkey来填充*set变量?

python - 重写Django queryset的Update方法

Python:只返回整数