2010-10-30 3 views
2

Я пробовал несколько апробаций, но поскольку я не могу использовать self в классе, я сам. __class__.__name__ недоступен. Нужно ли мне переопределить метод save для этого? Спасибо за вашу помощь.получить имя класса модели Django в поле

+0

попробуйте сам .__ класс __.__ name__ вместо. – twneale

+0

извините, что это была опечатка, она тоже не работает. Self не доступен в теле моделей django ... – user443850

ответ

5

Ваш вопрос странно сформулирован, поэтому я собираюсь подойти к нему сбоку.

Предположим, что вы определили модель Foo следующим образом:

from django.db import models 

class Foo(models.Model): 

    foo = models.IntegerField() 
    bar = models.IntegerField() 

    def klass(self): 
     return self.__class__.__name__ 

Предположив запуске оболочки Django (python manage.py shell), вы можете сделать следующее:

>>> from foo.models import Foo 
>>> foo = Foo() 
>>> print foo.klass() 
Foo 

Это свидетельствует о том, что вы можете обязательно используйте self.__class__.__name__ в корпусе любого метода для модели Foo. Таким образом, у вас должен быть другой контекст, в котором вам нужно динамически определять фактическое имя класса для вашей модели, но не из экземпляра вашей модели.

Если вы закончили определение модели, то следующее является законным:

>>> print Foo._meta.object_name 
Foo 

Этот механизм позволит вам сделать самоанализ непосредственно против модели, без необходимости создания экземпляра модели.

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

0

Это более или менее то, что я хочу:

class VFXContainer(models.Model): 

      classname=models.CharField(max_length=60,editable=False,blank=True) 
      parent=models.ForeignKey("self",blank=True,null=True) 

      def save(self, *args, **kwargs): 
       self.classname=self.__class__.__name__ 
       super(VFXContainer, self).save(*args, **kwargs) 

    class Company(VFXContainer): 
      class Meta: 
       verbose_name_plural="companies" 

    class Project(VFXContainer): 
     pass 

    class CustomVFXContainer(VFXContainer): 
     pass 

Теперь, что я не знаю, как сделать, я хочу «переопределить» вариант limit_choices_to в родительском поле на дочерних классах. То, что я хочу, - это CustomVFXContainer для того, чтобы быть родителем для любого типа класса, Project только для того, чтобы быть зарегистрированным Компанией, и Компания не должна быть родительской. Im использует эту структуру по следующей причине. Там будет тонна полей, которые я хочу быть во всех подклассах, и у меня также есть отдельные модели задач, которые связаны через внешний ключ с базовым классом VFXContainer (и, следовательно, могут быть прикреплены к любому из дочерних классов) , Надеюсь, это поможет вам понять, что я пытаюсь достичь, спасибо за вашу помощь.

+0

Вы должны посмотреть на ** django-polymorphic-tree ** https://github.com/edoburu/django-polymorphic-tree - он объединяет древовидную структуру с использованием mptt с полиморфными моделями, чтобы вы могли подключать разрозненные модели так, как вы описываете ... предполагая, что это конвейерная сделка, которую вы хотите проверить на производительность, хотя, если у вас есть много задач – mogga

Смежные вопросы