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?

Odpowiedzi:


184

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

obj = Class.objects.get(pk=this_object_id)

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ć.


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.


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="")


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.