代码之家  ›  专栏  ›  技术社区  ›  Jorge Arévalo

在django中将f()与包含另一个查询表达式的注释一起使用

  •  1
  • Jorge Arévalo  · 技术社区  · 8 年前

    这是我的(简化的)用例:

    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的位置字段排序 是的。所以,我需要 在上连接A和B表 MyType 第一。试过这个:

    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型的“类型”字段 是的。 看起来f应用于内部查询,而不是外部查询。

    那么,有没有更好的方法得到我想要的?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Jorge Arévalo    8 年前
    # 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版本的django_子查询 here