Django-Datenbankabfrage: Wie erhalte ich ein Objekt anhand der ID?


105

Django erstellt automatisch ein ID-Feld als Primärschlüssel.

Jetzt muss ich das Objekt anhand dieser ID abrufen.

object = Class.objects.filter() 

Wie schreibe ich diesen Filter?

Antworten:


179

Wenn Sie ein Objekt erhalten möchten, ist die Verwendung get()einfacher:

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

18
Zu Ihrer Information, pkist die bevorzugte Methode, um für jedes Modell auf den Primärschlüssel zu verweisen. Das idFeld wird nur generiert, wenn der Modellautor keinen Primärschlüssel speziell angibt. Wenn der Autor hat ein Primärschlüsselfeld angeben, der nicht namentlich genannt wird id, dann wird es nicht sein idFeld.
Craig Trader

Auch zu Ihrer Information, idin einer integrierten Funktion, die die Identität eines Objekts zurückgibt. In den meisten Fällen wird das Referenzieren von Dingen iddas Richtige tun, z Class.objects.get(id=this_object_id). B. Arbeit. Aber das ist wohl etwas zu beachten.
Tom

15

Ich bin aus demselben Grund hierher gekommen, aber aus einem anderen Grund:

Class.objects.get(id=1)

Dieser Code löste eine ImportError-Ausnahme aus. Was mich verwirrte, war, dass der folgende Code einwandfrei ausgeführt wurde und wie erwartet eine Ergebnismenge zurückgab:

Class.objects.all()

Ende des Tracebacks für die get()Methode:

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

Als loading.pyich den Code in Djangos las , kam ich zu dem Schluss, dass ich settings.pyeinen schlechten Weg zu meiner App hatte, die meine ClassModelldefinition enthält . Alles was ich tun musste, war den Pfad zur App zu korrigieren und die get()Methode einwandfrei auszuführen.

Hier ist mein settings.pymit dem korrigierten Pfad:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # ...
    'mywebproject.myapp',

)

Die ganze Verwirrung wurde verursacht, weil ich Djangos ORM als Standalone verwende, also musste der Namespace dies widerspiegeln.


2

Sie können auch tun:

obj = ClassModel.get_by_id(object_id)

Dies funktioniert, aber ich bin mir möglicherweise nicht sicher, ob es in Django 2 unterstützt wird.


2

Sie können verwenden:

objects_all=Class.objects.filter(filter_condition="")

Dies gibt einen Abfragesatz zurück, selbst wenn er ein Objekt erhält. Wenn Sie genau ein Objekt benötigen, verwenden Sie:

obj=Class.objects.get(conditon="")

0

Sie können auch die Django-Verknüpfung get_object_or_404 verwenden. Es wird ein 404-Fehler ausgelöst, wenn das Objekt nicht gefunden wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.