2009-02-01 20 views
10

Her şeyden önce, web programlamaya girmiyorum. Django'ya çarptım ve modeller hakkında biraz bilgi okudum. Doğru, piton, first_name anlayışıma göreDjango model alanları nasıl çalışır?


class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 

    def __str__(self): 
     # Note use of django.utils.encoding.smart_str() here because 
     # first_name and last_name will be unicode strings. 
     return smart_str('%s %s' % (self.first_name, self.last_name)) 

ve sınıf değişkenleri last_name şunlardır: I (djangoproject.com itibaren) aşağıdaki kodla ilgimi çekti? Bu kodda nasıl kullanılır (çünkü Person.first_name veya Person.last_name öğesinin tüm Kişi örneklerini etkileyeceğini tahmin ediyorum)? Neden bu şekilde kullanılıyor?

cevap

4

Evet, first_name ve last_name sınıf değişkenleridir. Bir veritabanı tablosunda oluşturulacak alanları tanımlar. First_name ve last_name sütunlarına sahip bir Kişi tablosu vardır, bu nedenle bu noktada Class seviyesinde olmaları mantıklıdır. http://docs.djangoproject.com/en/dev/topics/db/models/

o kodda İnsanda örneklerini erişmek söz konusu , genellikle Django'nın ORM aracılığı yapıyoruz ve bu noktada onlar esasen örnek değişkenler olarak davranırlar:

modellerde daha fazla bilgi için bkz. Model örnekleri hakkında daha fazlası için

, bkz: http://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs

+0

Danke schon Andy için çok

! – Geo

+0

Burada bazı iyi bağlantılar var, ama "bu noktada temelde örnek değişkenler gibi davranıyorlar", gerçekte doğru olmayan (ya da en azından bir şeyi açıklamıyor) el sallamasının bir parçasıdır. –

+1

Yeterince adil ... Elimi ona kaldıracağım. Cevabınız + 1. :) –

19

sorunuzun özü nasıl birdenbire (I verileri atamak olan) örnek değişkenler haline (ben alan nesneleri atamak) bu sınıf değişkenleri gel" dir Django'nun ORM'si? Bunun cevabı, Python metaclasses'un büyüsüdür.

Bir meta sınıf, bir Python sınıfı oluşturma işlemine (bu sınıfın bir örneğinin oluşturulmasına değil, sınıfın kendisinin oluşturulmasına) geçiş yapmanıza ve bunları değiştirmenize izin verir.

Django'nun Model nesnesinin (ve ayrıca alt sınıflar olan modellerin) bir ModelBase metaclass vardır. Modelinizin tüm sınıf özelliklerine bakar ve herhangi bir Alan alt sınıfının örneklerini bir alan listesine taşır. Bu liste, modelin bir sınıf özniteliği olan _meta nesnesinin bir özniteliği olarak atanır. Böylece, gerçek Alan nesnelerine her zaman MyModel._meta.fields veya MyModel._meta.get_field('field_name') aracılığıyla ulaşabilirsiniz.

Model.__init__ yöntemi, model örneği oluşturulduğunda hangi örnek özniteliklerinin başlatılması gerektiğini belirlemek için _meta.fields listesini kullanabilir.

Django kaynak koduna dalmaktan korkmayın; Bu harika bir eğitim kaynağı! Ama zenginleşmesi için

+0

+1: Bu harika bir voodoo. Derinlemesine anlaman gereken bir şey değil. Ancak, açık örnek değişken kurallarını büktüğünü ve nesnelerin oluşturulma biçimine başka bir katman eklediğini görmeniz gerekir. –

+0

Güzel açıklama. – Harold

+0

Serin. Merak ediyorum: '_meta', resmi model API’nin bir parçası mıdır? – pcv

0

Gerçek bir cevap:

Person.first_name 

p = Person.objects.get(pk=x) 
p.first_name 

çalışacak çalışmayacaktır. böylece kişinin nesne örneğinin bir adı ve soyadı vardır, fakat Statik bağlam Kişi yoktur.

Ayrıca dikkat: Django, "Kişinin" statik queryset işlemleri yapmasına izin veren Model Yöneticilerine sahiptir. (Https://docs.djangoproject.com/en/dev/topics/db/managers/#managers). Örneğin

peoples = Person.objects.all() 
İlgili konular