2009-07-21 12 views
80

Denetleyicimden yönlendirmeler: "Herhangi bir mantığı models.py içine koymaktan kaçınmak istiyorum. Buradan yola çıkarak, yalnızca veritabanına erişmek için sınıflar olarak kullanalım ve tüm mantıkları model sınıflarını kullanan dış sınıflarda tutalım veya Sarın onları. "models.py büyük olsun, onu kırmanın en iyi yolu nedir?

Bunun yanlış giden yol olduğunu hissediyorum. Ben sadece küçük tutmak için kötü mantıklı bir modeldir. Mantık modelde en iyisi ise, dosya boyutundan bağımsız olarak gerçekten nereye gitmeli.

Sadece kullanmanın basit bir yolu var mı? PHP-konuşmasında, sadece models.py numaralı ambarın diğer yerlerden model sınıfları içerdiğini denetlemek istiyorum. Kavramsal olarak, bu, modellerin istediğimiz tüm mantığa sahip olmasına izin verir, ancak dosya sayısını (dosyadaki çakışmalar, vb. Gibi daha az revizyon kontrolü sorunlarına yol açacak şekilde) artırarak dosya boyutunu korur.

Modeller, model sınıflarını models.py dosyasından kaldırmanın basit bir yolu var, ancak yine de modellerin tüm Django araçlarıyla çalışması var mı? Veya, "büyük" models.py dosyasının genel sorununa tamamen farklı ama zarif bir çözüm var mı? Herhangi bir girdi takdir edilecektir.

+6

İçe aktarma ifadesini biliyorsunuz değil mi? – balpha

+6

PS. Bu saldırıyı kastetmiyorum, sadece nerede olduğunuzu bilmek istiyorum. – balpha

+0

Evet, ancak django'nun yönetici araçlarının yalnızca Modelleri çekmek için içe aktarma ifadelerini kullanıp kullanmayacağını bilmiyordum. Ben sadece django'nun araçlarıyla iyi oynamadıklarını öğrenmek için düz ole ithalatı kullanmaya çalışırken çok zaman harcamaktan daha fazlasını istiyorum. Ben python ve django için daha yeni olduğumu itiraf ediyorum, bu yüzden muhtemelen sadece ithalat ifadesinin basit bir anlayış var ... – Eddified

cevap

61

Django, büyük bir uygulama yerine çok sayıda küçük uygulama oluşturmanıza izin verecek şekilde tasarlanmıştır.

Her büyük uygulamada, özgür olmaya çalışan çok sayıda küçük uygulama var.

models.py ürününüzün büyük olduğunu düşünüyorsanız, çok fazla şey yapıyorsunuz. Durdurmak. Rahatlayın. Ayrıştırmak.

Daha küçük, yeniden kullanılabilir küçük uygulama bileşenleri veya parçaları bulun. Bunları aslında yeniden kullanmanız gerekmez. Sadece onları yeniden kullanılabilir olarak düşünün.

Yükseltme yollarınızı düşünün ve bir gün değiştirmek isteyebileceğiniz uygulamaları çözün. aslında değiştirmenize gerek yoktur, ancak bunları ileride daha serin bir şekilde değiştirilebilecek programlamanın tek başına bir "modülü" olarak düşünebilirsiniz.

Yaklaşık bir düzine uygulama var, her bir model.py, yaklaşık 400 satırdan daha fazla kod içermiyor. Hepsi yarım düzine ayrık sınıf tanımlarından daha azına odaklanmış durumdalar. (Bunlar zor sınırlar değildir, bizim kodumuzla ilgili gözlemlerdir.)

Erken ve sık sık ayrışırız.

+1

doğru noktada. önemsiz olmayan bir web uygulaması birkaç küçük 'uygulama' olacaktır. Katkı ve diğer popüler uygulamaların bir ipucu almak, kullanıcı kimlik doğrulaması bir uygulama, etiketleme başka bir, kullanıcı profilleri bir, vb., – Javier

+4

Bu "doğru" yol olsa da ve yararlı, bu ne de olsa İçin bakıyordum. Ne tür bir cevap aradığımı bilmenin bir yolu olmasaydı özür dilerim.:) – Eddified

+0

@Eddified: Bunu yapmazsanız, sadece daha da kötüleşecektir. Şimdi bölmeye başla. ;-) Büyük ve güçlü haklı ayrıntılı olarak tam olarak bu açıklayarak I (OSCON de) Jacob Kaplan Moss dinliyorum hemen şu anda –

93

Model sınıfları, model üzerinde çalışacak yöntemleri içermek için doğaldır. Bir Kitap modelim varsa, book.get_noun_count() yöntemiyle, ait olduğu yer budur - yöntem aslında esasen başka bir pakete ait olmadıkça "get_noun_count(book)" yazmak zorunda kalmak istemiyorum. (Örneğin, örneğin, "get_amazon_product_id(book)" ile Amazon'un API'sine erişmek için bir paketim varsa.)

Django'nun belgeleri tek bir dosyada modelleri oluşturmayı önerdiğinde onu sıkıca bağladım ve en başından birkaç dakika aldım onu uygun bir alt pakete nasıl bölüştüreceğimizi öğrenmek için."Site.models defterini almak itibaren"

from .book import Book 

yüzden hala yazabilirsiniz: gibi

site/models/__init__.py 
site/models/book.py 

__init__.py görünüyor.

aşağıdaki sadece Django 1.7 öncesinde sürümleri için gereklidir

, sadece hüner nedeniyle Django bir hatadan açıkça her modelin uygulamasını ayarlamak gerekir ki https://code.djangoproject.com/ticket/3591

bkz : Uygulama adının model yolunda üçüncü ve son giriş olduğunu varsayar. "site.models.Book", "site" ile sonuçlanır; "site.models.book.Book", uygulama adının "modeller" olduğunu düşünmesini sağlar. Bu Django'nun parçası üzerinde oldukça kötü bir hack; muhtemelen bir önek eşleşmesi için yüklü uygulamaların listesini aramalıdır.

class Book(models.Model): 
    class Meta: app_label = "site" 

Muhtemelen bu genelleme bir temel sınıf veya metaclass kullanabilirsiniz, ama henüz o rahatsız değil.

+2

+1 olarak adlandırılacaktır. Bunu başarı ile kullanmıştım. S. Lott birden fazla uygulamada doğru bir fikir olsa da, buradaki ve şimdi çözüm budur. –

+0

Bunu yapmanın yolu budur. http://code.djangoproject.com/wiki/CookBookSplitModelsToFiles –

+0

@Alexander Ljungberg: Django web sitesinde daha fazla bilgiyi kolayca bu uygulamalarına göz bölme daha basit olduğuna ikna olmadım. Uygulamalar oldukça basit orijinal 'models.py'den ayrılabilir. Genellikle, urls.py, views.py, tests.py ve models.py adreslerinden kesip yapıştırma işleminden sadece biraz daha fazlası olur. Modellerinizin yakından ve özünde ilgili olduğunda –

4

Mümkün olan pek çok olası sorundan tam olarak yararlanamıyorum. Aynı dosyada

  • birden fazla model

    ayrı dosyalar halinde koyun: İşte cevapları ile bazı olasılıklar vardır. Bağımlılıklar varsa, ek modellerini çekmek için içe aktarma özelliğini kullanın. models.py

    yılında

  • gereksiz mantık/fayda fonksiyonları ayrı dosyalar halinde ekstra mantığı koyun. ayrı bir dosyada oluşturun veritabanı

    yeni Manager bazı modeli örneklerini seçme

  • statik yöntemler.

  • yöntemleri tabii ki modeli

    kaydetmek __unicode__ ve get_absolute_url ilişkin örneklerdir.

İlgili konular