2011-03-21 25 views
6

Bir sayfadaki çeşitli içerik türlerini yönetmek için bir sistem oluşturmaya çalışıyorum. Örneğin, bir sayfada metin içeriği, köprü içeriği, video içeriği vb.Django Model Kalıtım ve Yönetim Sistemi

class ContentItem(models.Model): 
    title = models.CharField(max_length=1000) 
    page_order = models.IntegerField() 
    last_update_date = models.DateTimeField(default=datetime.now()) 

    class Meta: 
     abstract = True 
     ordering = ['page_order', 'last_update_date', 'title'] 

Bu, tüm içerik öğeleri için temel sınıftır: Benim modelleme kodunda

, ben bir temel sınıf var. Sayfa sırası, sayfada hangi konumda olduğunu kontrol eder, örneğin, page_order = 0 öğesinin sayfanın üst kısmında olması gerekir. Ardından, bunlardan miras kalan birkaç özel içerik modeli tanımlarım.

Çok daha fazla içerik türü olabilir. Sonra çeşitli içerik türlerinden oluşan bir Sayfa modeli tanımlayacağım. İdeal olarak, tüm türleri taban türüne bağlı olarak ilişkiye koyabilirim. Yani bu ilişkide bir LinkContents, TextContents ve VideoContents karışımı olurdu. Şablonu oluştururken sayfadaki sırasını belirlemek için page_order tarafından sıralanırlar.

class Page(models.Model): 
    contents = models.ManyToManyField(ContentItem) 
    title = models.CharField() 

Böyle bir plan çalışması yapmak için herhangi bir yolu var mı? Yoksa farklı model tipleri ile bir ilişkisi var mıdır? Bildiğim kadarıyla, temelde polimorfizmi benim avantajımla kullanmaktan çok iyi bir çözüm ve nesne yönelimli programlama bakış açısı olduğunu biliyorum, ancak veritabanı seviyesinde mantıklı olduğundan emin değilim.

class Page(models.Model): 
    video_contents = models.ManyToManyField(VideoContent) 
    link_contents = models.ManyToManyField(LinkContent) 
    text_contents = models.ManyToManyField(TextContent) 
    title = models.CharField() 

İşe yarayacağını biliyorum ama sayfadaki nesnelerin yerleşimini belirlemek benim şeması daha zorlaşır:

yerine daha böyle bir şey gerekiyor mu. Tüm içerik ilişkilerini geçmem gerekiyor, onları page_order ile sıralamalı ve sonra bunları oluşturmam gerekiyor.

Her iki durumda da, her bir belirli içerik türünün devralacağı temel sınıfta bir render() yöntemini bildirmek istiyorum. Bu şekilde, ContentItems'in bir listesi varsa, özel türlerini düşünmeden bunları oluşturmak için ördek yazmayı kullanabilirim.

Son sorum, yöneticinin bununla nasıl güzel bir yer olmasını sağlayabilirim? Tek bir sayfada bir sayfa oluşturan tüm ContentItems'i görmenin kolay bir yolunu nasıl yapabilirim, böylece sayfa değiştirmeyi değiştirerek kolayca dolaşabilirler?

Daha fazla bilgiye ihtiyacınız varsa, bunu okuduğunuz için teşekkür ederiz.

cevap

3

Bunu yapmanın iyi bir yolu. Ne yazık ki, Django'nun ORM modeli model kalıtımı istediğiniz kadar sorunsuz işlemez. page.contents, Content nesnelerinin bir QuerySet içerecektir. Alt türlere erişmek istiyorsanız, bir içerik nesnesini downcasting'in bir yolunu oluşturmanız gerekir. Sorun şu ki, bu nesne başına hızlı bir şekilde çıkabilen bir sorgu gerektiriyor. This blog post, sahnelerin arkasında select_related() kullanarak karışık alt türlerin bir sorguda elde edilmesine yönelik bir tekniği açıklar.

+1

Teşekkürler @jcdyer. Bu çok yararlı bilgiler oldu. Yine de belirsiz olduğum bir şey, bu çalışmayı Yönetici arayüzünde nasıl yapacağım. İdeal olarak, Sayfa içeriğini listelemenin bir yolunu ve belirli bir sınıfa dayanan öğe için uygun yönetici formunun gösterilmesini istiyorum. Örneğin, bir Sayfada 2 LinkContent ve 1 TextContent içeriğine sahipse, ilk ikisinin Link formuyla ve diğeri metin formunda düzenlenebilir olmasını istiyorum. Böyle bir şey yapmanın basit bir yolu var mı? Çok fazla yönetici uyarlaması yaptım, ama hiç böyle bir şey görmedim. – Jon