Django: параметризация db_table для наследования - PullRequest
0 голосов
/ 25 января 2011

Я хочу установить атрибут мета-класса db_table в базовом классе, чтобы все наследуемые классы имели свои имена, подобно тому, как Django обрабатывает related_name атрибут поля модели:

class BaseModel(models.Model):
    class Meta:
        db_table = 'prefix_%(class)s'

Таким образом, унаследованная модель:

class SubModel(BaseModel):
    pass

будет иметь таблицу базы данных prefix_submodel.

Возможно ли это?Может ли Meta-класс получить доступ к имени модели унаследованного класса?

1 Ответ

1 голос
/ 25 января 2011

Нет.Вы не можете сделать это.Не так просто иметь одну и ту же таблицу для хранения нескольких классов.

Возможно, вам нужен djeneralize project.

Из примеров:

class Fruit(BaseGeneralizedModel):
   name = models.CharField(max_length=30)

   def __unicode__(self):
       return self.name

class Apple(Fruit):
   radius = models.IntegerField()

   class Meta:
       specialization = 'apple'

class Banana(Fruit):
   curvature = models.DecimalField(max_digits=3, decimal_places=2)

   class Meta:
       specialization = 'banana'

class Clementine(Fruit):
   pips = models.BooleanField(default=True)

   class Meta:
       specialization = 'clementine'

which then allows the following queries to be executed:

>>> Fruit.objects.all() # what we've got at the moment
[<Fruit: Rosy apple>, <Fruit: Bendy banana>, <Fruit: Sweet
clementine>]
>>> Fruit.specializations.all() # the new stuff!
[<Apple: Rosy apple>, <Banana: Bendy banana>, <Clementine: Sweet
clementine>]
...