Acemi: Uygulamaların Django etkileşim anlamaya çalışıyorum

oy
28

Sadece ikinci kez Django eğiticilerimizi çalışan tamamladıktan var ve artık çok daha net anlaşılması ediyorum. Ancak, bir site içinde uygulamalar birbirleriyle nasıl etkileşimde hala belirsiz değilim.

Örneğin, ben (görünüşte, oldukça popüler bir etkinliktir) Blog uygulaması yazıyorum Diyelim. Blog yayınlar ve yorumlar birlikte gitmek eğilimindedir ve Djano geliştirme genel felsefesi olduğu gibi henüz onlar ayrı uygulamalar içine inşa edilmesi gerektiğini yeterince ayrıdır.

Aşağıdaki örneği ele alalım. Gerçekte ben aslında bunun için iyi bir kod Web'de mevcut olarak yorum, kendimi app yazmak olmaz, ama bu gösteri / uygulama amaçlıdır:

mysite / blog / models.py

from django.db import models

class post(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    content = models.TextField()

mysite / yorum / models.py

from django.db import models
from mysite.blog.models import post

class comment(models.Model):
    id = models.AutoField()
    post = models.ForeignKey(post)
    author = models.CharField(max_length=200)
    text = models.TextField()

Django etkileşim uygulamalarının sayısına, başka bir uygulamanın bir model ithal ve yabancı anahtar olarak ayarlayarak, yukarıda yazdıklarımı mı? Veya etkileşim için bir site oluşturan uygulamalar için farklı / daha iyi bir yöntem var mıdır?

Güncelleme
bir tepki olarak öneri Başına ben contrib.contenttypes belgelerine okuyorum. Ben doğru okuyorsam, ben böyle benim örnek comment app yazabilirsiniz:

from django.db import models  
from django.contrib.contenttypes.models import ContentType
from django.contrib.contentypes import generic

class comment(models.Model):  
    id = models.AutoField()  
    author = models.CharField(max_length=200)  
    text = models.TextField()  
    content_type = models.ForeignKey(ContentType)  
    content_object = generic.GenericForeignKey(content_type, id)  

Bu doğru olabilir mi?

Oluştur 09/12/2008 saat 18:25
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
21

Django yıllardan bir göz atın yerleşik contenttypes çerçevede :

django.contrib.contenttypes

Bu kendi başına birimler olarak uygulamaları geliştirmeye olanak sağlar. Bu django geliştiriciler django yerleşik izin vermek için kullanılır ne açıklama çerçevesinde projenizde herhangi modele bir yorum eklemek için.

Eğer her kullanıcının bir blog post, resim veya kullanıcı profilinde bir "favori" yıldızı ayrılmak için izin gibi farklı türde başka içerik nesnelere "eklemek" istiyorum bazı içerik nesnesi varsa Örneğin, bir oluşturabilir Favoritebir model genel ilişki alanında şöyle:

from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Favorite(models.Model):
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

Bu şekilde bir ekleyebilir Favoriteprojenizde herhangi modele herhangi bir kullanıcı yıldızı. Eğer alıcı modeli sınıfına aracılığıyla API erişimini eklemek istiyorsanız bir ekleyebilir ya ters jenerik ilişki alanını (bu "kavrama" iki model olacağını olsa da kaçınmak istediğini söyledi ki,) Alıcı modeline veya arama yapmak aracılığıyla Favoritebarındıran model content_typeve object_idalıcı örneğinin, bkz resmi belgeler bir örnek için.

Cevap 09/12/2008 saat 19:01
kaynak kullanıcı

oy
3

Başka bazı uygulama bağımlı hale ile yanlış bir şey (imho) var. Sonuçta, uygulamalar modelleri sette sadece operasyonlardır. Sadece her zaman hangi uygulamaların hangi bağlıdır hangi uygulamanın farkında olmak zorunda (Sana bir bağımlılık haritası diyebiliriz sanırım).

Sen contenttypes çerçeve gevşek bağlantı elde edebilirsiniz. Bir uygulama geçmeli / gerçekten taşınabilir henüz hala diğer uygulamalar ile entegre olmasını sağlar.

Ben açıklamalar (özel etiketler kullanarak) konmalıdır sayfanın şablonda birkaç satır, başka herhangi bir uygulama entegre edilebileceğini, (evet, ben tekerleği yeniden yaratıyor) bir comments app yazdı.

Manken "iplik" herhangi başka bir model haline takılabilecek şekilde istediğini farz edelim. Fikir E jenerik yabancı anahtar (bu konuda django belgelerine bakın) oluşturun ve herhangi bir nesne alır ve ona karşılık gelen bir "iş parçacığı" döndürür (veya bir gerekirse oluşturur) küçük bir işlev yazma ve bir özel şablon etiketini yazmak için olduğunu örneğin bu işlevselliği kullanır {% get_thread for arbitrary_object as thread %}. Tüm mesaj herhangi bir tipte olabilir, nesne ile ilgilidir, burada bir vida ile ilgilidir.

Bunun sadece bir anlamda soyut bir iplik, alakalı, vekil bir tür olarak "iplik" nesne düşünebiliriz, bunun yerine bir yazı olan belli bir "makalesinde" veya bir "blog post" ile ilişkili ne olduğunu bir iplik nedir? Bu mesajların sadece bir koleksiyonun. İplik daha sonra kendisi cinsine bakılmaksızın herhangi bir nesneye ilişkin izin verir. (bundan daha fazlasını yapar rağmen, vb, sayfada yorumları açılış / / izin anon. Mesajları izin vermeme, kapatılması gibi ek bilgileri tutunabileceği ..)

DÜZENLE

Burada içerik türleri çerçevesi ile genel bir yabancı anahtar oluşturabilirsiniz açıklanmıştır:

from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType

class Thread( models.Model ):
    object_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    object = generic.GenericForeignKey('object_type', 'object_id')

Sen Django tüm nesneler uygulamak varsayar örtülü "ortak" bir arayüz istismar ederek daha "şeffaf" yapabilir ..

    #inside the Thread class:
    def __unicode__(self):
        return unicode(self.object)
    def get_absolute_url(self):
        return self.object.get_absolute_url()
Cevap 09/12/2008 saat 19:35
kaynak kullanıcı

oy
3

"Ben başka bir uygulamanın bir model ithal ve Django etkileşim uygulamalarının sayısına yabancı anahtar olarak ayarlama, yukarıda yazdıklarımı mı?"

Evet. Benim için çalışıyor.

Biz kendi aralarında geri ve ileri ödünç yaklaşık 10 uygulamalara sahiptir.

Bu bizim birim test komut bağımlılık bir tür yol açar.

Bu şuna benzer.

  • "Sahiplik". Biz diğer uygulamalar bağlı bazı çekirdek mülkiyet kavramlarını tanımlayan basit bir veri sahipliği uygulaması vardır. Burada bir kaç basit tablo vardır.

  • "şey". [Değil Gerçek adı]. Bizim şey uygulaması farklı kullanıcı gruplarına ait veri elemanları vardır. Aslında birçok karmaşık tablo bu uygulama için bir model vardır. Bu "mülkiyet" bağlıdır.

  • "Tabloları". [Değil Gerçek adı]. Bazı kullanıcılarımızın (muhtemelen elektronik tablolar ile) oldukça karmaşık off-line modeller oluşturmak ve "tabloları" o modelleme sonuçlarını yükleyin. Bu oldukça karmaşık tablolar bir küme vardır. Bu "mülkiyet" bağlıdır.

  • "sonuç". [Değil Gerçek adı]. Sonuçlarımız sahibi olmayan şeylere dayanır. Sonuçlar şeyler ve tablolarda dayalı ve müşteri isteklerine cevaplardır edilir. Bu, belki de sadece iki ya da üç temel tablolar çok karmaşık değildir. Bu "şeyler" ve "masaya" bağlıdır. Hayır, tamamen tek başına değil. Ancak, varlığını dayandırdığı diğer şeyler daha değişime tabidir. ayrı nedeni budur.

  • "işleme". Biz planlamak ve büyük toplu işlerini izler. Bu, bu uygulamada olduğunu. Gerçekten jenerik, ve çeşitli şekillerde kullanılabilir. Tamamen tek başına durur.

  • "Hoşgeldiniz". Biz çoğunlukla statik sayfalar bir demet sunan bir "karşılama" uygulaması vardır. Bu çok fazla tabloları yok. İlk çok karmaşık olduğu için Ama bu ikinci enkarnasyonu üzerinde. Tamamen tek başına durur.

bağımlı uygulamalar arasında tek ilişki bazı tablo isimleri. uygun gördüğümüz sürece biz bu tabloları (ve kendi anahtarlarını) korumak olarak biz diğer uygulamaları yeniden düzenleyebilirsiniz.

Cevap 09/12/2008 saat 19:06
kaynak kullanıcı

oy
2

Kodunuz doğru görünüyor. Ben de yazı ve yorum tutacak blog olsa app. Bunun demiyorum Django yolu, ancak bu modeller aynı uygulamasında olacak kadar yakın.

Nasıl Projesi bölün için

Bir uygulama eğer ayırmak istiyorum;

  • Ben resuable tasarlayın planlıyoruz. (Ve gevşek bağlantı deneyin)
  • Bu projenin önemli bir bölümünün oluşur (büyük projeler için).

Diğer yandan; (Örneğin, tek bir model ve iki görüş bir uygulaması olarak) pek çok küçük uygulama olan okuma ve IMHO muhafaza etmek zordur.

Uygulamalar etkileşim Should Nasıl

Bu projenin türüne ve tekrar app türüne bağlıdır. Örneğin, bir uygulama (örneğin, jenerik olan) içe ve diğer uygulama referanslar kullanılarak kabul edilebilir bir ilgili dolaylı bağımlı olup olmadığını. Bu durumda ikinci uygulaması tek başına yüklenmiş olabilir, ancak ilk bir saniye varlığını gerektirir.

Eğer böyle bir yorum yapma uygulaması gibi bir uygulama son derece yeniden kullanılabilir ve jenerik olmak için, bazı kurulum mekanizması entegre etmek gerekebilir. Belki bazı yeni ayarlar veya ek URL yapılandırma veya modellerde özel yönerge / yöntemi ... django.contrib.adminbunun için iyi bir örnektir.

olsa Gerekli değilse Uygulamalar etkileşime girmemelidir. Gereksiz bağlantı önlemek için uygulamalar tasarlamak çok yararlıdır. Bu uygulamanızın esnekliği artırır ve daha sürdürülebilir (ama muhtemelen entegre daha yüksek bir maliyetle) yapar.

Cevap 09/12/2008 saat 18:45
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more