Django automatycznie tworzy pole id jako klucz podstawowy.
Teraz muszę pobrać obiekt za pomocą tego identyfikatora.
object = Class.objects.filter()
Jak napisać ten filtr?
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:
Jeśli chcesz zdobyć obiekt, użycie get()
jest prostsze:
obj = Class.objects.get(pk=this_object_id)
id
we wbudowanej funkcji, która zwraca tożsamość obiektu. W większości przypadków odwoływanie się do rzeczy id
będzie dobre, np Class.objects.get(id=this_object_id)
. Zadziała. Ale to chyba coś do rozważenia.
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.py
miałem złą ścieżkę do mojej aplikacji, która zawiera Class
definicję modelu. Wszystko, co musiałem zrobić, to poprawić ścieżkę do aplikacji i get()
poprawnie wykonać metodę.
Oto moja settings.py
z 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ć.
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="")
Możesz także użyć skrótu get_object_or_404 django. Jeśli obiekt nie zostanie znaleziony, zgłasza błąd 404.
Jeśli nie masz jakiegoś identyfikatora, np. Mysite.com/something/9182301, możesz użyć get_object_or_404
importu 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)
pk
to preferowany sposób odwoływania się do klucza podstawowego dla dowolnego modelu.id
Pole 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 imieniemid
, wtedy nie będzieid
pola.