Zapytanie do bazy danych Django: Jak uzyskać obiekt przez id?

106

Django automatycznie tworzy pole id jako klucz podstawowy.

Teraz muszę pobrać obiekt za pomocą tego identyfikatora.

object = Class.objects.filter() 

Jak napisać ten filtr?

user469652
źródło

Odpowiedzi:

184

Jeśli chcesz zdobyć obiekt, użycie get()jest prostsze:

obj = Class.objects.get(pk=this_object_id)
opalowy
źródło
18
FYI pkto preferowany sposób odwoływania się do klucza podstawowego dla dowolnego modelu. idPole jest generowane tylko wtedy, gdy model autor nie specjalnie wyznaczają klucz podstawowy. Jeśli autor nie określił pola klucza podstawowego, który nie jest imieniem id, wtedy nie będzie idpola.
Craig Trader
Również FYI, idwe wbudowanej funkcji, która zwraca tożsamość obiektu. W większości przypadków odwoływanie się do rzeczy idbędzie dobre, np Class.objects.get(id=this_object_id). Zadziała. Ale to chyba coś do rozważenia.
Tom
15

Dostałem się tutaj z tego samego problemu, ale z innego powodu:

Class.objects.get(id=1)

Ten kod generował wyjątek ImportError. Zmyliło mnie to, że poniższy kod wykonał się poprawnie i zwrócił wynik zgodny z oczekiwaniami:

Class.objects.all()

Ogon śledzenia dla get()metody:

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

Czytając kod wewnątrz Django loading.py, doszedłem do wniosku, że settings.pymiałem złą ścieżkę do mojej aplikacji, która zawiera Classdefinicję modelu. Wszystko, co musiałem zrobić, to poprawić ścieżkę do aplikacji i get()poprawnie wykonać metodę.

Oto moja settings.pyz poprawioną ścieżką:

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

)

Całe zamieszanie było spowodowane tym, że używam ORM Django jako samodzielnego, więc przestrzeń nazw musiała to odzwierciedlać.

Lucio Paiva
źródło
2

Możesz też:

obj = ClassModel.get_by_id(object_id)

To działa, ale może nie jestem pewien, czy jest obsługiwane w Django 2.

Anthony
źródło
2

Możesz użyć:

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

To zwróci zestaw zapytań, nawet jeśli otrzyma jeden obiekt. Jeśli potrzebujesz dokładnie jednego obiektu, użyj:

obj=Class.objects.get(conditon="")
Pratik Randad
źródło
1

Możesz także użyć skrótu get_object_or_404 django. Jeśli obiekt nie zostanie znaleziony, zgłasza błąd 404.

Loaderon
źródło
0

Jeśli nie masz jakiegoś identyfikatora, np. Mysite.com/something/9182301, możesz użyć get_object_or_404importu przez from django.shortcuts import get_object_or_404.

Użyj przykładu:

def myFunc(request, my_pk):
    my_var = get_object_or_404(CLASS_NAME, pk=my_pk)
Ebert Rodrigues
źródło