将 F() 与注释一起使用,包括 Django 中的另一个查询表达式
Using F() with annotations including another query expression in Django
这是我的(简化的)用例:
from django.db import models
class MyType(models.Model):
whatever = models.CharField()
class A(models.Model):
type = models.ForeignKey(MyType)
class B(models.Model):
my_type = models.ForeignKey(MyType)
position = models.IntegerField(default=0)
我希望 A 中的元素按 B 的位置字段排序。因此,我需要先 在 MyType
上加入 A 和 B 表。试过这个:
A.objects.all().annotate(position=B.objects.get(my_type=models.F('type')).position).order_by('position')
得到错误:
FieldError: Cannot resolve keyword 'type' into field. Choices are: my_type, my_type_id, position
因此,Django 明白 F('type')
正在尝试获取模型 B 的 'type' 字段的值。当然,这并不存在。 我想使用模型 A 的 'type' 字段。 看起来 F 适用于内部查询,而不适用于外部查询。
那么,有什么更好的方法可以得到我想要的吗?
# Django 1.11 already includes OuterRef and Subquery, but I'm working with Django 1.9
from django_subquery.expressions import OuterRef, Subquery
items = B.objects.filter(my_type=OuterRef('type')).order_by('position')
A.objects.all().annotate(position=Subquery(items.values('position')[:1])).order_by('position')
为早于 1.11 的 Django 版本从 here
获取 django_subquery
这是我的(简化的)用例:
from django.db import models
class MyType(models.Model):
whatever = models.CharField()
class A(models.Model):
type = models.ForeignKey(MyType)
class B(models.Model):
my_type = models.ForeignKey(MyType)
position = models.IntegerField(default=0)
我希望 A 中的元素按 B 的位置字段排序。因此,我需要先 在 MyType
上加入 A 和 B 表。试过这个:
A.objects.all().annotate(position=B.objects.get(my_type=models.F('type')).position).order_by('position')
得到错误:
FieldError: Cannot resolve keyword 'type' into field. Choices are: my_type, my_type_id, position
因此,Django 明白 F('type')
正在尝试获取模型 B 的 'type' 字段的值。当然,这并不存在。 我想使用模型 A 的 'type' 字段。 看起来 F 适用于内部查询,而不适用于外部查询。
那么,有什么更好的方法可以得到我想要的吗?
# Django 1.11 already includes OuterRef and Subquery, but I'm working with Django 1.9
from django_subquery.expressions import OuterRef, Subquery
items = B.objects.filter(my_type=OuterRef('type')).order_by('position')
A.objects.all().annotate(position=Subquery(items.values('position')[:1])).order_by('position')
为早于 1.11 的 Django 版本从 here
获取 django_subquery