将Django模型类名称添加到字段中

时间:2010-10-30 22:13:17

标签: django django-models

我尝试过多次aproaches,但因为我不能在课堂上使用self,所以自我。__class__.__name__不可用。我是否需要覆盖save方法才能执行此操作?谢谢你的帮助。

2 个答案:

答案 0 :(得分: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 shell(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进行硬编码即可。如果您在模型创建过程中确实需要一种动态方式来确定模型的名称...您能描述一下您尝试解决的实际问题,以便我们可以帮助您解决它吗?

答案 1 :(得分: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只是公司的父级,公司根本不是父级。我使用这种结构的原因如下。我希望在所有子类中有大量字段,并且我还有一个单独的Tasks模型,它们通过外键链接到基本VFXContainer类(因此可以附加到任何子类) 。希望这能让我更清楚我想要实现的目标,感谢您的帮助。

相关问题