Django veritabanı sorgusu: Kimliğe göre nesne nasıl alınır?


106

Django, birincil anahtar olarak otomatik olarak bir kimlik alanı oluşturur.

Şimdi nesneyi bu id ile almam gerekiyor.

object = Class.objects.filter() 

Bu filtre nasıl yazılır?

Yanıtlar:


184

Bir nesne almak istiyorsanız, kullanmak get()daha basittir:

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

18
Bilginize, pkherhangi bir model için birincil anahtara atıfta bulunmanın tercih edilen yolu. idModel yazar özellikle bir birincil anahtar tayin etmezse alanı sadece oluşturulur. Yazar , adlandırılmamış bir birincil anahtar alanı belirtmişse id, o zaman bir idalan olmayacaktır .
Craig Trader

Ayrıca FYI, idbir nesnenin kimliğini döndüren yerleşik bir işlevde. Çoğu durumda, bir şeylere atıfta bulunmak iddoğru şeyi yapacaktır, örneğin Class.objects.get(id=this_object_id)iş. Ama sanırım bu dikkate alınması gereken bir şey.
Tom

15

Buraya aynı problem için geldim, ama farklı bir sebepten:

Class.objects.get(id=1)

Bu kod bir ImportError istisnası yaratıyordu. Kafamı karıştıran şey, aşağıdaki kodun iyi işlemesi ve beklendiği gibi bir sonuç kümesi döndürmesiydi:

Class.objects.all()

Yöntem için geri dönüşün kuyruğu get():

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

Django'nun içindeki kodu okurken, model tanımımı içeren uygulamama giden kötü bir yol olduğu loading.pysonucuna vardım . Tek yapmam gereken, uygulamaya giden yolu düzeltmekti ve yöntem iyi uygulandı.settings.pyClassget()

İşte settings.pydüzeltilmiş yolum:

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

)

Tüm karışıklık, Django'nun ORM'sini bağımsız olarak kullandığım için ortaya çıktı, bu yüzden ad alanının bunu yansıtması gerekiyordu.


2

Şunları da yapabilirsiniz:

obj = ClassModel.get_by_id(object_id)

Bu işe yarıyor, ancak Django 2'de desteklenip desteklenmediğinden emin olamayabilirim.


2

Kullanabilirsiniz:

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

Bu, bir nesne alsa bile bir sorgu kümesi döndürür. Tam olarak bir nesneye ihtiyacınız varsa kullanın:

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


0

Kimliğiniz yoksa, örneğin mysite.com/something/9182301, ile get_object_or_404içe aktarmayı kullanabilirsiniz from django.shortcuts import get_object_or_404.

Örnek kullanın:

def myFunc(request, my_pk):
    my_var = get_object_or_404(CLASS_NAME, pk=my_pk)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.