【问题标题】:Passing Related Row to Django Database Function将相关行传递给 Django 数据库函数
【发布时间】:2018-02-14 07:16:23
【问题描述】:

是否可以将相关字段的行传递到 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

【问题讨论】:

    标签: python django postgresql django-queryset


    【解决方案1】:

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

    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')
    

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

    我希望这会有所帮助

    【讨论】:

    • 感谢您的回复,但这是我在示例中显示的无效语法。问题是我不想枚举每一列(如在第二个示例中),并且我想要 m2m 相关对象的外键相关对象。您的解决方案将产生 m2m 对象的字段或 fk 对象的字段
    • 我明白了。我会对不需要枚举所有列的答案非常感兴趣。在这里等待;)。对于第二条评论,您可以继续使用双下划线来获取与 m2m 对象相关的 fk:ModelA.objects.all().values('m2mrelatedobj__ModelC1_FK_name__FK_filed_name')。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2012-11-13
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多