Как я нахожу “реальный класс” django образцового базового класса

Вот пример без jQuery. Я не совсем уверен, к какому объекту данных вы обращаетесь, но после того, как у вас есть каждый элемент в цикле, нужно извлечь то, что вам нужно.

var xclassget=document.getElementsByClassName('black-p stacard caading');
var attributes = []
Object.keys(xclassget).forEach(function(el) {
  var element = xclassget[el]
  attributes.push({
    'coin-value': element.attributes['coin-type'].value,
    'coin-name': element.attributes['coin-name'].value,
    'coin-rank': element.attributes['coin-rank'].value,
    })

})

console.log(attributes)
11
задан Mr Shark 8 December 2008 в 11:11
поделиться

3 ответа

Django реализует образцовое наследование с OneToOneField между таблицей родительской модели и таблицей дочерней модели. Когда Вы делаете Base.object.all(), Django запрашивает просто Базовую таблицу, и также - никакой способ знать, какова дочерняя таблица. Поэтому, к сожалению, не возможно перейти непосредственно к дочернему образцовому экземпляру без дополнительных запросов.

Этот отрывок показывает общепринятую методику добавления поля ContentType к базовой модели:

from django.contrib.contenttypes.models import ContentType

class Base(models.Model):
    content_type = models.ForeignKey(ContentType,editable=False,null=True)

    def save(self):
        if(not self.content_type):
            self.content_type = ContentType.objects.get_for_model(self.__class__)
        self.save_base()

    def as_leaf_class(self):
        content_type = self.content_type
        model = content_type.model_class()
        if(model == Base):
            return self
        return model.objects.get(id=self.id)

Можно затем сказать if Base.content_type.model_class() определить тип.

Вот другой отрывок, который добавляет пользовательского менеджера в соединение.

Как Вы видите, оба из этих решений имеют потенциал, чтобы быть чрезвычайно дорогими. Если у Вас будет большое количество экземпляров, с помощью as_leaf_class (), то метод потребует одного запроса на каждом объекте.

Вместо этого если Вы имеете известный набор дочерних моделей, просто запрашиваете каждую модель отдельно и агрегировали экземпляры в один список.

13
ответ дан 3 December 2019 в 07:39
поделиться

Это чувствует себя хрупким, потому что это. (Это - перепечатка ответа в другом контексте. Посмотрите, что C++ бросает программно: это может быть сделано?)

Читайте на полиморфизме. Почти каждый "динамический бросок" ситуация является примером полиморфизма, изо всех сил пытающегося быть реализованным.

Независимо от того, что решение, которое Вы делаете в динамическом броске, было уже принято. Просто делегируйте реальную работу к подклассам.

Вы не учли самую важную часть своего примера. Полезная, полиморфная работа.

Когда Вы сказали, что "Я хочу определить, имеет ли объект тип Child_1 или Child_2...", Вы не учли, "таким образом, я могу заставить объект сделать aMethod() способом это уникально для каждого подкласса". Тот метод является полезной работой, и это должен просто быть метод обоих подклассов.

class Base(models.model):
    def aMethod(self):
        # base class implementation.

class Child_1(Base):
    def aMethod(self):
        # Child_1 override of base class behavior.

class Child_2(Base):
    def aMethod(self):
        supert( Child_2, self ).aMethod() # Invoke the base class version
        # Child_2 extension to base class behavior.

Тот же метод, несколько реализаций. Никогда потребность к "динамической идентификации типов" или определению реального класса.

-2
ответ дан 3 December 2019 в 07:39
поделиться

Ну ... Моя проблема была. В представлении у меня была эта основная модель, скажем «Big_Model», и были некоторые «Small_Model», связанные с «Big_Model». Поэтому, когда я хотел получить всю «Small_Model», относящуюся к определенному экземпляру «Big_Model», я сделал это ** _ set.all (). Но дело в том, что Small_Model имеет дочерние классы, и я хотел в views.py узнать, к какому дочернему классу относится каждый из экземпляров Small_Model. Моя уловка заключалась в том, чтобы определить логические методы в модели Small_Model, такие как is_child_1 () и is_child_2 (). И когда это правда, вы применяете фактический дочерний указатель вместо указателя Small_Model.

Хорошо ... Это недостаточно ясно, но у меня нет времени, чтобы написать хороший пример, поэтому я просто скопирую сюда свой случай:

class Cache(models.Model):
  valor = models.DecimalField(max_digits=9, decimal_places=2, blank= True, null= True)
  evento=models.ForeignKey(Evento)
  def __unicode__(self):
    return u'%s: %s' % (self.evento, self.valor)
  class Meta:
    verbose_name='Cachê'
    verbose_name_plural='Cachês'
  def is_cb(self):
    try:
      self.cache_bilheteria
      return True
    except self.DoesNotExist:
      return False
  def is_co(self):
    try:
      self.cache_outro
      return True
    except self.DoesNotExist:
      return False
0
ответ дан 3 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: