我尝试过多次aproaches,但因为我不能在课堂上使用self,所以自我。__class__.__name__
不可用。我是否需要覆盖save方法才能执行此操作?谢谢你的帮助。
答案 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类(因此可以附加到任何子类) 。希望这能让我更清楚我想要实现的目标,感谢您的帮助。