Kiedy proszę menedżera modelu o uzyskanie obiektu, podnosi się, DoesNotExist
gdy nie ma pasującego obiektu.
go = Content.objects.get(name="baby")
Zamiast tego DoesNotExist
, jak mogę go
być None
zamiast tego?
python
django
django-queryset
TIMEX
źródło
źródło
SomeModel.objects.filter(foo='bar').first()
tej wartości, zwracając pierwsze dopasowanie lub Brak. Nie zawiedzie, jeśli istnieje kilka takich przypadkówqueryset.get()
filter().first()
, myślę, że wyjątek jest najlepszym rozwiązaniem.Od wersji django 1.6 możesz użyć metody first () w następujący sposób:
źródło
Z dokumentów django
Możesz złapać wyjątek i przypisać
None
go.źródło
Możesz w tym celu utworzyć funkcję ogólną.
Użyj tego jak poniżej:
go będzie Brak, jeśli żaden wpis pasujący inny nie zwróci wpisu Treść.
Uwaga: Zgłasza wyjątek MultipleObjectsReturned, jeśli zwrócono więcej niż jeden wpis dla name = "baby"
źródło
Możesz to zrobić w ten sposób:
Teraz zmienna go może być obiektem, który chcesz lub Brak
Patrz: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
źródło
Aby to ułatwić, oto fragment kodu, który napisałem, oparty na danych z cudownych odpowiedzi tutaj:
A potem w twoim modelu:
Otóż to. Teraz masz MyModel.objects.get () oraz MyModel.objetcs.get_or_none ()
źródło
możesz użyć
exists
z filtrem:tylko alternatywa, jeśli chcesz tylko wiedzieć, czy istnieje
źródło
Note: If you only want to determine if at least one result exists (and don’t need the actual objects), it’s more efficient to use exists().
exists()
Będzie więc używany zif
klauzulą przed pobraniem obiektu, powodując podwójne trafienie do bazy danych. Nadal będę trzymał komentarz na wypadek, gdyby pomógł komuś innemu.Obsługa wyjątków w różnych punktach twoich widoków może być naprawdę kłopotliwa. Co z definiowaniem niestandardowego Menedżera modeli w pliku models.py, np.
a następnie uwzględnienie go w klasie Model treści
W ten sposób można łatwo sobie z tym poradzić w widokach, tj
źródło
return self.get(**kwargs)
, aby działał dla mnie. Nie mówię, że coś jest nie tak z odpowiedzią, tylko wskazówka dla każdego, kto próbuje użyć jej w późniejszych wersjach (lub z czymkolwiek innym, co powstrzymuje mnie od pracy).Jest to jedna z tych irytujących funkcji, których możesz nie chcieć ponownie wdrożyć:
źródło
get_object_or_None
ale stwierdziłem, że wciąż się podnosi,MultipleObjectsReturned
jeśli więcej niż jeden obiekt. Tak więc użytkownik może rozważyć otoczenie za pomocątry-except
(które sama funkcjatry-except
już ma).Jeśli potrzebujesz prostego jednoliniowego rozwiązania, które nie wymaga obsługi wyjątków, instrukcji warunkowych ani wymagań Django 1.6+, zrób to zamiast tego:
źródło
Myślę, że nie jest to zły pomysł
get_object_or_404()
Ten przykład jest równoważny z:
Możesz przeczytać więcej o get_object_or_404 () w dokumentacji online django.
źródło
Od wersji django 1.7 możesz wykonywać następujące czynności:
Zaletą „MyQuerySet.as_manager ()” jest to, że oba poniższe elementy będą działać:
źródło
Oto odmiana funkcji pomocnika, która pozwala opcjonalnie przekazać w
QuerySet
instancji, na wypadek, gdybyś chciał uzyskać unikalny obiekt (jeśli jest obecny) z zestawu zapytań innego niżall
zestaw zapytań obiektów modelu (np. Z podzbioru elementów potomnych należących do instancja nadrzędna):Można tego użyć na dwa sposoby, np .:
obj = get_unique_or_none(Model, **kwargs)
jak wcześniej omówionoobj = get_unique_or_none(Model, parent.children, **kwargs)
źródło
Bez wyjątku:
Korzystanie z wyjątku:
Jest trochę kłótni na temat tego, kiedy należy użyć wyjątku w Pythonie. Z jednej strony „łatwiej prosić o wybaczenie niż o pozwolenie”. Chociaż zgadzam się z tym, uważam, że wyjątek powinien pozostać, no cóż, wyjątek, a „idealna sprawa” powinna przebiegać bez trafienia w jeden.
źródło
Możemy użyć wyjątku wbudowanego Django, który jest dołączony do modeli o nazwie as
.DoesNotExist
. Więc nie musimy importowaćObjectDoesNotExist
wyjątku.Zamiast tego:
Możemy to zrobić:
źródło
Jest to kopia naśladująca metodę get_object_or_404 Django, z wyjątkiem tego, że metoda zwraca None. Jest to niezwykle przydatne, gdy musimy użyć
only()
zapytania, aby pobrać tylko niektóre pola. Ta metoda może zaakceptować model lub zestaw zapytań.źródło
Może lepiej użyć:
źródło