SORU
30 Mayıs 2009, CUMARTESİ


Nasıl alt sınıf adını bilmeden django içinde bir nesnenin alt sınıflar erişebilirim?

Sınıfından miras alan bir üst sınıf ve birden çok alt sınıfları varsa, Django, normalde parentclass çocuğun erişim.childclass1_set veya parentclass.childclass2_set, ama istersem özel alt sınıf adını bilmiyorum eğer doğru değilse ne?

Bir şekilde ana -^ ilgili nesneleri elde etmek için vardır . çocuk sınıf adını bilmeden alt tarafta?

CEVAP
30 Mayıs 2009, CUMARTESİ


(Güncelleme: Django 1.2 ve daha yeni, takip select_related sorguları ters OneToOneField ilişkiler (ve böylece aşağı kalıtım hiyerarşileri), orada daha iyi bir tekniği olan gerektirmez ekledi real_type sahada üst modeli. django-model-utils proje InheritanceManager olarak kullanılabilir.)

Bunu yapmak için her zamanki gibi uygun "" sınıf. yaprak içerik türü saklayan Üst modeli ContentType bir ForeignKey eklemektir Bu olmadan, çocuk tabloları, sorguları çok sayıda örneğini bulmak için, miras ağaç ne kadar bağlı olabilir. Bir proje yaptım:

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

class InheritanceCastModel(models.Model):
    """
    An abstract base class that provides a ``real_type`` FK to ContentType.

    For use in trees of inherited models, to be able to downcast
    parent instances to their child types.

    """
    real_type = models.ForeignKey(ContentType, editable=False)

    def save(self, *args, **kwargs):
        if not self.id:
            self.real_type = self._get_real_type()
        super(InheritanceCastModel, self).save(*args, **kwargs)

    def _get_real_type(self):
        return ContentType.objects.get_for_model(type(self))

    def cast(self):
        return self.real_type.get_object_for_this_type(pk=self.pk)

    class Meta:
        abstract = True

Bu yeniden kullanılabilir hale için soyut temel sınıf olarak uygulanır; aynı zamanda yöntem ve FK bu doğrudan belirli bir kalıtım hiyerarşisi içinde üst sınıf üzerine koyabilirsiniz.

Bu çözüm eğer üst modelini değiştirmek mümkün değilse işe yaramaz. Bu durumda hemen hemen tüm alt sınıflar el ile kontrol kaldın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MagicofRahat

    MagicofRahat

    13 Temmuz 2007
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Press Start

    Press Start

    4 HAZİRAN 2006