根据模型属性获取Django对象ID

35

我有一个基本模型名为"Places",其中包含以下视图:

def view_index(request, place_name):

用户将通过以下URL访问该视图:

http://server.com/kansas

"kansas" 是存储在模型 "Places" 的名为 "name" 的字段中的一个值。

问题是我无法仅基于对象名称来获取对象id。是否有方法可以做到这一点?

4个回答

79

像这样:

place = Places.objects.get(name='kansas')
print(place.id)

18

如果你只需要 id,那么你应该只查询 id。简单的 get 会检索数据库行中的所有字段。使用以下任一方法都可以只获取所需的数据。

id = Place.objects.filter(name='kansas').values('id')[0]['id']

或者使用values_list:

id = Place.objects.filter(name='kansas').values_list('id', flat=True).first()

另一种方法使用 only

id = Place.objects.only('id').get(name='kansas').id

这个方案相比已接受的答案会更高效吗? - Hassan Baig
2
是的,但差异是否重要取决于其余列的功能。如果表恰好具有包含数兆字节数据的巨大文本或JSON字段,则绝对会有影响! - Scott Stafford

5
你的视图URL映射长成什么样子呢?假设你要捕获URL中带有"kansas"的部分,并将其设置为place_name参数,那么你就需要在你的模型管理器上简单地进行一次filter,以查找你所要寻找的"kansas"字段。如果你的URL mapping如下所示:
('(?P<place_name>\w+)$', 'myapp.view.view_index')

那么您应该能够做到这一点。
object_list = Model.objects.filter(place_name = place_name)

要获取一个对象列表,其中place_name与URL中的匹配。从那里开始,该列表中的每个对象都应该有一个id(除非您已重命名ID字段),您可以像访问任何其他Python对象属性一样访问它。


1

除了接受的响应之外,您可以按如下方式探索“Place”模型中所有地点的ID:

使用列表推导或任何其他方便的数据结构。

objects = Place.objects.all()
id_name_pair = [(object.id, object.name) for object in objects]

这将返回一个元组列表,其中包含您的“Place”模型的每个名称及其对应的id。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接