- 1. verknüpfungen.py
- 2. Beispiel
Django-Verknüpfungen haben eine Funktion get_object_or_404 , aber es gibt keine Funktion get_object_or_none , was nützlich sein kann, wenn wir nicht sofort einen 404-Fehler auslösen möchten, aber gleichzeitig eine Aktion ausführen müssen dass, wenn das Objekt nicht in der Datenbank existiert.
Ich habe es geschafft, eine Diskussion im Internet zu finden, in der die Entwickler abgemeldet haben, dass eine solche Funktionalität einfach als until-Funktion innerhalb des Entwicklerprojekts implementiert werden kann und es nicht erforderlich ist, sie im Hauptcode zu implementieren.
Ich brauchte ähnliche Funktionen, um auf der Website nach Tags zu suchen.
Daher habe ich es als Verknüpfung zum Kern der Website hinzugefügt.
verknüpfungen.py
# -*- coding: utf-8 -*- def get_object_or_none(klass, *args, **kwargs): try: return klass._default_manager.get(*args, **kwargs) except klass.DoesNotExist: return None
Beispiel
def get_queryset(self, **kwargs): q = self.request.GET.get('q') tag = get_object_or_none(Tag, name=q) if tag: return TaggedItem.objects.all().filter(tag=tag) return []
В вашем случае происходит подмена сущностей. Вместо того, чтобы взять один конкретный объект, вы забираете queryset а потом берёте из него первый объект. Нехорошо будет, если queryset в каком-то случае вернёт два объекта или более. Проблема в том, что вы не узнаете об этой ошибке никак, а это нарушит логику работы приложения с последствиями в будущем. Мой вариант решения хотя бы порушит приложение и даст знать что существует два одинаковых по каким-то параметрам объекта, и нужно будет принимать меры для исправления.
Согласен с тем что ваше решение более очевидно при чтении кода. first() же здесь применяется не совсем по назначению. А с последствиями "моего" решения не согласен. Метод вернёт только один объект, если он существует, или None. А целостность базы данных лучше, наверно, проверять на этапе добавления записи, а не при доступе к ней. В остальном поведение идентично вашему методу.
А вы гарантируете, что метод first вернёт нужный объект, если в таблице две похожих записи? Этого никто не гарантирует. Может возникнуть неопределённое поведение приложения, если запись не так, что требовалась. А насчёт целостности базы данных перед добавлением я согласен, хотя по идее уровни блокировки на чтение записи в самой базе данных должны разруливать такую ситуацию, но у меня случалась подобная ситуация. Увы..