将相关行传递给Django数据库函数

时间:2017-09-05 22:48:35

标签: python django postgresql django-queryset

是否可以将相关字段的行传递到django数据库函数中,如果是这样,我该如何实现?当我尝试时,我最终得到一个整数(id列)而不是行。

型号:

class ModelA(models.Model):
    pass


class ModelB(models.Model):
    pass


class ModelC(models.Model):
    model_a_rel = models.ManyToManyField(
        ModelA, 
        related_name='m2mrelatedobj'
    )
    fkobj = models.ForeignKey(
        ModelB
    )

所需的查询集:

ModelA.objects.annotate(
    my_annotation=DatabaseFn('m2mrelatedobj__model_a_rel')
).filter(my_annotation=True)

我的目标是将fkobj传递到DatabaseFn,以便连接在查询集上完成一次,而不是在每个注释中。

这在django中甚至可能吗?现在,我从postgres函数得到一个错误,说它收到一个整数而不是一行,它表示django没有进行额外的连接。非常感谢任何见解,谢谢。

环境Django v1.10.3, python 2.7, postgresql 9.5

1 个答案:

答案 0 :(得分:0)

也许您正在寻找下划线表示法。像这样:

ModelC.objects.all().values('model_a_rel__field_ModelA1_name','model_a_rel__field_ModelA2_name','fkobj__ModelB1_field_name')

或者相反:

ModelA.objects.all().values('m2mrelatedobj__ModelC1_field_name')

这些查询是数据库的往返。在外键的情况下,它将返回一行包含所需的列。在很多情况下,它会为每个现有关系返回一行,并使用下划线表示法选择列。

我跳这个帮助