2010-10-30 187 views
2

我已经尝试了多种方法,但是因为我不能在类体中使用self,所以我自己。 __class__.__name__不可用。我需要重写保存方法来做到这一点?谢谢你的帮助。将Django模型类名变为字段

+0

尝试使用self .__ class __.__ name__代替。 – twneale 2010-10-30 22:14:54

+0

对不起,这是一个错字,它也不工作。自我在Django模型的主体中不可用... – user443850 2010-10-31 00:31:26

回答

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 

这表明,你可以对于型号Foo的任何方法,肯定使用self.__class__.__name__。因此,您必须有一些其他上下文,您需要动态确定模型的实际类名称,而不是从模型的实例中确定。

如果你已经完成定义模型,再下面是合法的:

>>> 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只被公司授权,并且公司根本不授予授权。我使用这个结构的原因如下。我希望在所有子类中都有很多字段,并且我还有一个单独的Tasks模型,它通过外键链接到基本VFXContainer类(因此可以连接到任何子类) 。希望这可以让我更清楚自己想要达到的目标,谢谢你的帮助。

+0

你应该看看** django-polymorphic-tree ** https://github.com/edoburu/django-polymorphic-tree-它结合了使用mptt的树结构使用多态模型,所以你可以用你描述的方式连接不同的模型...假设这是一个管道交易,你会想要测试它的性能,但如果你有很多任务 – mogga 2016-04-07 18:11:31