【问题标题】:Getting model instance when using QuerySet.values()使用 QuerySet.values() 时获取模型实例
【发布时间】:2017-09-18 12:32:06
【问题描述】:

假设我有两个模型,一个引用另一个:

class Shelf(models.Model):
     pass

class Book(models.Model):
     shelf = models.ForeignKey(Shelf)

我想在 Book 实例的 QuerySet 上使用 values()

In [1]: Book.objects.create(shelf=Shelf.objects.create())
Out[1]: <Book: Book object>

In [2]: Book.objects.values()
Out[2]: [{'id': 1, 'shelf_id': 1}]

问题是返回的字典只包含相关Shelf 实例的主键,而不是实例本身。有没有办法在单个查询中获取实际实例?例如:

In [2]: Book.objects.values()
Out[2]: [{'id': 1, 'shelf': <Shelf: Shelf object>}]

我使用values() 的原因是我可以合并两个用于不同模型的查询集,我想对它们进行排序并呈现到视图中的单个表中。

【问题讨论】:

  • “实际模型”是什么意思?调用values()后可以在字典中设置型号名称:book_vals = Books.objects.all(); book_vals['model_name'] = Book.__name__
  • @alfonso.kim 我想获取模型实例作为字典中的值。我更新了问题以更清楚。

标签: django django-orm


【解决方案1】:

根据docs

如果您有一个名为 foo 的字段是 ForeignKey,则默认 values() 调用将返回一个名为 foo_id 的字典键,因为这 是存储实际值的隐藏模型属性的名称 (foo属性指的是相关模型)。

我认为默认的values() 实现是不可能的。您可以创建一个custom manager 并覆盖values() 方法,为模型的每个ForeignKey 创建一个多级字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2018-08-22
    相关资源
    最近更新 更多