Получить идентификатор объекта Django на основе атрибута модели - PullRequest
22 голосов
/ 11 января 2011

У меня есть базовая модель с именем "Places", которая имеет такой вид:

def view_index(request, place_name):

Пользователь получит доступ к этому представлению с помощью URL-адреса, подобного следующему:

http://server.com/kansas

"Канзас" - это значение, хранящееся в поле с именем "name" внутри модели "Places".

Проблема в том, что я не могу понять, как получить идентификатор объекта, основываясь только на имени объекта. Есть ли способ сделать это?

Ответы [ 3 ]

47 голосов
/ 11 января 2011

Как это:

place = Places.objects.get(name='kansas')
print place.id
8 голосов
/ 06 января 2015

Поскольку вы хотите только 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
4 голосов
/ 11 января 2011

Как выглядит ваше сопоставление URL для этого представления?Предполагая, что вы захватываете часть своего URL с "kansas" в нем, и это устанавливается в аргумент place_name, вам нужно будет сделать простой filter в менеджере вашей модели в любом поле модели, в котором вы находитесь.ищите "kansas" in.

Если ваше сопоставление URL выглядит следующим образом:

('(?P<place_name>\w+)$', 'myapp.view.view_index')

Тогда вы сможете просто набрать

object_list = Model.objects.filter(place_name = place_name)

, чтобы получить списокобъектов, которые имеют place_name, совпадающий с URL-адресом.Оттуда каждый из объектов в этом списке должен иметь id (если вы не переименовали поле идентификатора), который вы можете получить, как и любой другой атрибут объекта python.

...