使用 Django ORM 中的列过滤器获取主键 ID

Posted

技术标签:

【中文标题】使用 Django ORM 中的列过滤器获取主键 ID【英文标题】:Get Primary key id with Column filter in Django ORM 【发布时间】:2020-05-06 21:37:34 【问题描述】:

我的 Postgresql 中有一张 books 表。下图是表结构的样子。

现在,我有 book_name “249”,我想获取其对应的主键 5。下面是我正在尝试执行的查询,但 Django 抛出错误。

我的书名 = 249

books.model.filter(book_name=my_book_name).get('book_id') # Not Working

有人可以建议正确的 ORM 查询来获取 book_name 的相应 book_id 吗?

注意:- 我删除了 PK=4,这就是它在列中丢失的原因。

【问题讨论】:

【参考方案1】:

您可以在这里使用.values(..)

Books.objects.<b>values('book_id')</b>.get(book_name=my_book_name)['book_id']

但使用.values(..) 通常不是一个好主意。通常,您将Book object 提取到内存中,例如:

book = Books.objects.get(book_name=my_book_name)
book.book_id  # 5

但即便如此,也有可能有多本书(或根本没有书)具有该名称。所以你应该使用.filter(..)来获得QuerySetBooks。 QuerySet 是一个 惰性 集合,因此可以在此处包含零个、一个或多个 Book 对象:

books = Books.objects.filter(book_name=my_book_name)

【讨论】:

【参考方案2】:

我不知道你为什么使用 get 过滤器!试试这个

books.objects.filter(book_name=my_book_name).values('book_id')

这将为所有具有 book_name=my_book_name 的条目返回 book_id

【讨论】:

谢谢哥们!..顺便说一句,它应该是“books.objects.filter”而不是“books.model.filter”

以上是关于使用 Django ORM 中的列过滤器获取主键 ID的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django ORM 使用 UNION 指定 SELECT 中的列顺序

Django ORM 使用过滤器进行注释

解决-Django使用filter过滤时间,无法获取月份的问题

Django ORM 按过滤器排序

Django通过多对多ORM对象中的多个标签进行过滤

使用 ORM Django 过滤新更新的查询集返回空查询集