2014-12-18 3 views
0

Я пытаюсь создать абстрактную модель для реализации наследуемых функциональных возможностей для сохранения в поле слива в методе сохранения.Выбор имени поля абстрактной модели Django

У меня есть что-то очень близкое, хотя единственная проблема в том, что некоторым моделям понадобится поле с именем «имя», а некоторым моделям потребуется поле под названием «title».

Вот что модель прокси выглядит следующим образом:

class SaveSlug(models.Model) 
    ''' 
    Save an identifying slug based on the title/name field on save 
    ''' 

    name = models.CharField(max_length=30) 
    title = models.CharField(max_length=30) 
    slug = slug = models.SlugField(db_index=True, unique=True) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 

     super(SaveSlug, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 

Все отлично работает за исключением того, что я хочу, чтобы каким-то образом указать в дочерних моделей, следует ли включать в поле «имя» или поле «название». Какие-либо предложения? Благодарю.

ответ

1

Хорошим подходом будет использование суперкласса для общих полей и подкласс для имени и названия.

class Slug(models.Model) 
    slug = models.SlugField(db_index=True, unique=True) 

    class Meta: 
     abstract = True 

class NamedSlug(Slug) 
    name = models.CharField(max_length=30) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     super(NamedSlug, self).save(*args, **kwargs) 

class TitledSlug(Slug) 
    title = models.CharField(max_length=30) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.title) 
     super(TitledSlug, self).save(*args, **kwargs) 
+0

Спасибо! Да, это улучшение. Если возможно, я хотел бы избавиться от повторного очень похожего метода сохранения. – awwester

Смежные вопросы