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?
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?
Respostas:
Se você deseja obter um objeto, usar get()
é mais simples:
obj = Class.objects.get(pk=this_object_id)
id
em uma função interna que retorna a identidade de um objeto. Na maioria dos casos, fazer referência a coisas por id
fará a coisa certa, por exemplo, Class.objects.get(id=this_object_id)
trabalhar. Mas isso é algo a se considerar, eu acho.
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.py
havia um caminho incorreto para o meu aplicativo que contém a Class
definiçã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.py
caminho 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.
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="")
Você também pode usar o atalho get_object_or_404 django. Ele gera um erro 404 se o objeto não for encontrado.
pk
é a maneira preferida de se referir à chave primária para qualquer modelo. Oid
campo 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 é nomeadoid
, então não haverá umid
campo.