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)
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.
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ć.
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_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)
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 imieniemid, wtedy nie będzieidpola.