views:

40

answers:

2

I have tried multiple aproaches, but as I cannot use self in the class body, self.__class__.__name__ is not available. Would I need to override the save method to do this? Thanks for your help.

+1  A: 

Your question is oddly phrased, so I'm going to come at it sideways.

Assume that you have defined a model Foo as follows:

from django.db import models

class Foo( models.Model ):

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

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

Supposing you start a Django shell (python manage.py shell), you can do the following:

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

This demonstrates that you can certainly use self.__class__.__name__ in the body of any method for model Foo. Thus you must have some other context where you need to dynamically determine the actual class name for your model, but not from an instance of your model.

If you've finished defining the model, then the following is legal:

>>> print Foo._meta.object_name
Foo

This mechanism would allow you to do introspection directly against the model, without having to create an instance of the model.

If this doesn't work for you, you must need this during the actual definition of the model. In that case, I would respectfully suggest that if you know you're defining the Foo model, you should just hardcode Foo wherever you need it. If you really need a dynamic way during the creation of your model to determine the name of the model ... could you describe the actual problem you're trying to solve, so that we can help you solve it?

Craig Trader
A: 

This is more or less what I want:

  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

Now, what I dont know how to do, is I want to "override" the limit_choices_to option in the parent field on the child classes. What I want is CustomVFXContainer to be parented to any type of class, Project only to be parented by Company, and Company not to be parented at all. Im using this structure for the following reason. There is going to be a ton of fields that I want to be in all the subclasses, and I also have a separate Tasks models that link through a foreign key to the base VFXContainer Class (and thus is attachable to any of the child classes). Hope this makes it more clear on what Im trying to achieve, thanks for your help.