使用 QuerySet.values() 时获取模型实例

Feu*_*mel 5 django django-orm

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

class Shelf(models.Model):
     pass

class Book(models.Model):
     shelf = models.ForeignKey(Shelf)
Run Code Online (Sandbox Code Playgroud)

我想values()在实例的查询集中使用Book

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}]
Run Code Online (Sandbox Code Playgroud)

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

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

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

alf*_*kim 0

根据文档

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

我认为默认实现是不可能的values()。您可以创建自定义管理器并重写方法来为每个模型values()创建多级字典。ForeignKey