【问题标题】:Django ORM get respective choices value instead of field valueDjango ORM 获取各自的选择值而不是字段值
【发布时间】:2018-07-13 18:18:15
【问题描述】:

在 Django ORM 中,有什么方法可以直接获取相应的选择值而不是生成的查询集中的字段值。
示例:

port = models.CharField(
  max_length=5,
  choices=( ('21', 'FTP'), ('22', 'SSH'), (...), .. )
)

在 ORM 查询之后,我需要 Queryset 本身中的端口名称(而不是数字)。

查询:

> myModel.objects.filter(...).values()

输出:

> [{"id": 1, "port": "21"}, {"id": 2, "port": "22"}, {...}, ...]

我想要什么:

> [{"id": 1, "port": "FTP"}, {"id": 2, "port": "SSH"}, {...}, ...]

【问题讨论】:

  • 您能否发布您尝试进行的完整查询,然后指定预期结果以及您得到的结果。如果您显示 FULL 模型,它也会有所帮助。谢谢。
  • 你为什么在这里使用values()?获取 myModel 对象并在每个对象上调用 get_port_display()
  • 我知道,我可以轻松获取对象并对其进行循环或通过函数传递它。但我的问题是我需要结果查询集本身中的选择映射,无论是否使用values()。我只需要查询集有我的选择映射而不是存储的字段值。
  • 由于显示值未存储在 db 中并且 get__display() 是一个实例函数,我能想到的唯一选择是注释标签并在 for 循环中分配选择显示值.

标签: python django orm django-orm


【解决方案1】:

正如@neverwalkaloner 指出的那样,您不会在数据库中保存“FTP”等,因此无法使用查询集检索它们。你可以做的是这样的:

[{'id': obj.pk, 'port': obj.get_port_display()} for obj in myModel.objects.filter(...)]

这会给你:

[{"id": 1, "port": "FTP"}, {"id": 2, "port": "SSH"}, {...}, ...]

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2015-09-21
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多