Bar*_*vds 6 python django django-queryset
我正在寻找一种基于模型ForeignKey字段将一种类型的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')
Run Code Online (Sandbox Code Playgroud)
children_qs现在,这应该是先前查询中使用的所有Child实例的查询集,而不是返回Parent实例的查询集.
您可以使用自定义__in查询集和查找来执行此操作,但感觉有点臭:
class ParentQuerySet(models.QuerySet):
...
def children(self):
return Child.objects.filter(id__in=self.values_list('child_id', flat=True))
Run Code Online (Sandbox Code Playgroud)
这child_id将从Parent的查询集中的记录中获取所有FK,并直接重新查询Child.当我检查SQL它做了一个子查询,我不确定这是最优还是有一些奇怪的副作用.它看起来像原始父查询的排序已经消失,因此重复.
有人有更好的东西吗?
注意:我知道我可以通过Child直接查询并使用反向查找过滤Parent的字段,但这不支持您可以在主模型上执行的所有操作.
小智 5
试试这个,它将返回 Child 类的 query_set
parent_primary_keys = Parent.objects.filter(...).values_list('pk',flat=True)
children_qs = Child.objects.filter(id__in=parent_primary_keys)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2706 次 |
| 最近记录: |