Query database Django: come ottenere un oggetto per id?


105

Django crea automaticamente un campo id come chiave primaria.

Ora ho bisogno di ottenere l'oggetto da questo ID.

object = Class.objects.filter() 

Come scrivere questo filtro?

Risposte:


179

Se vuoi ottenere un oggetto, l'uso get()è più semplice:

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

18
Cordiali saluti, pkè il modo preferito per fare riferimento alla chiave primaria per qualsiasi modello. Il idcampo viene generato solo se l'autore del modello non designa specificamente una chiave primaria. Se l'autore ha specificato un campo chiave primaria che non è denominato id, non ci sarà un idcampo.
Craig Trader

Anche per tua informazione, idin una funzione incorporata che restituisce l'identità di un oggetto. Nella maggior parte dei casi, fare riferimento a cose per idfarà la cosa giusta, ad es Class.objects.get(id=this_object_id). Lavoro. Ma è qualcosa da considerare immagino.
Tom

15

Sono arrivato qui per lo stesso problema, ma per un motivo diverso:

Class.objects.get(id=1)

Questo codice generava un'eccezione ImportError. Ciò che mi ha confuso è che il codice seguente è stato eseguito correttamente e ha restituito un set di risultati come previsto:

Class.objects.all()

Coda del traceback per il get()metodo:

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

Leggendo il codice all'interno di Django loading.py, sono giunto alla conclusione che il mio settings.pyaveva un brutto percorso verso la mia app che contiene la mia Classdefinizione del modello. Tutto quello che dovevo fare era correggere il percorso per l'app e il fileget() metodo eseguito .

Ecco il mio settings.pycon il percorso corretto:

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

)

Tutta la confusione è stata causata perché sto usando ORM di Django come autonomo, quindi lo spazio dei nomi doveva riflettere questo.


2

Puoi anche fare:

obj = ClassModel.get_by_id(object_id)

Funziona, ma forse non sono sicuro che sia supportato in Django 2.


2

Puoi usare:

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

Ciò restituirà un set di query anche se ottiene un oggetto. Se hai bisogno di un solo oggetto usa:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.