2010-10-30 110 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