Consulta de banco de dados Django: Como obter objeto por id?

105

Django cria automaticamente um campo de id como chave primária.

Agora eu preciso obter o objeto por este id.

object = Class.objects.filter() 

Como escrever este filtro?

user469652
fonte

Respostas:

179

Se você deseja obter um objeto, usar get()é mais simples:

obj = Class.objects.get(pk=this_object_id)
iridescente
fonte
18
Para sua informação, pké a maneira preferida de se referir à chave primária para qualquer modelo. O idcampo só é gerado se o autor do modelo não designar especificamente uma chave primária. Se o autor fez especificar um campo de chave primária que não é nomeado id, então não haverá um idcampo.
Craig Trader
Também FYI, idem uma função interna que retorna a identidade de um objeto. Na maioria dos casos, fazer referência a coisas por idfará a coisa certa, por exemplo, Class.objects.get(id=this_object_id)trabalhar. Mas isso é algo a se considerar, eu acho.
Tom
15

Vim aqui pelo mesmo problema, mas por um motivo diferente:

Class.objects.get(id=1)

Este código estava gerando uma exceção ImportError. O que estava me confundindo é que o código abaixo foi executado corretamente e retornou um conjunto de resultados conforme o esperado:

Class.objects.all()

Cauda do traceback para o get()método:

File "django/db/models/loading.py", line 197, in get_models
    self._populate()
File "django/db/models/loading.py", line 72, in _populate
    self.load_app(app_name, True)
File "django/db/models/loading.py", line 94, in load_app
    app_module = import_module(app_name)
File "django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named myapp

Lendo o código dentro do Django loading.py, cheguei à conclusão de que settings.pyhavia um caminho incorreto para o meu aplicativo que contém a Classdefinição do meu modelo. Tudo que tive que fazer foi corrigir o caminho para o aplicativo e o get()método foi executado corretamente .

Aqui está o meu settings.pycaminho corrigido:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # ...
    'mywebproject.myapp',

)

Toda a confusão foi causada porque estou usando o ORM do Django como um autônomo, então o namespace teve que refletir isso.

Lucio paiva
fonte
2

Você também pode fazer:

obj = ClassModel.get_by_id(object_id)

Isso funciona, mas pode não ter certeza se é compatível com Django 2.

Anthony
fonte
2

Você pode usar:

objects_all=Class.objects.filter(filter_condition="")

Isso retornará um conjunto de consultas mesmo que obtenha um objeto. Se você precisa de exatamente um objeto, use:

obj=Class.objects.get(conditon="")
Pratik Randad
fonte
1

Você também pode usar o atalho get_object_or_404 django. Ele gera um erro 404 se o objeto não for encontrado.

Loaderon
fonte