2014-01-13 4 views
11

Я проектирую модель в Django, но я не знаю, является ли это лучшим способом. У меня есть модель под названием «История», и внутри этой модели у меня есть специализированная функция, которая будет обрабатывать вставки этой модели.Django - Функция внутри модели. Как назвать это с точки зрения?

Альтернатива 1

class History(models.Model): 
    field1 = models.ForeignKey(Request) 
    field2 = models.BooleanField() 
    field3 = models.DateTimeField() 

    def __unicode__(self): 
     return str(self.field1.id) 

    class Meta: # 
     ordering = ['-field3'] 

    def insert_history(self): 
     # Here I will have some business logic to insert the data to the history model 

Чтобы вставить данные в модель истории я ВСЕГДА должны использовать «insert_history» функцию.

Мои вопросы здесь:

Код выше правильно?

Если да, то как я могу назвать «insert_history» из представления?


Альтернатива 2

Я другой вариант, который я проверил, и он работает, но не чувствует себя правильный путь. Код выглядит следующим образом:

class History(models.Model): 
    field1 = models.ForeignKey(Request) 
    field2 = models.BooleanField() 
    field3 = models.DateTimeField() 

    def __unicode__(self): 
     return str(self.field1.id) 

    class Meta: # 
     ordering = ['-field3'] 

def insert_history(field1, field2, field3): 
    # Here I will have some business logic to insert the data to the history model 

И я называю это с тем, как это:

from app.models import insert_history 

insert_history('1', True, 'some_date') 

, что это правильный способ сделать это? Если альтернатива 1 верна, как я могу назвать «insert_history» из представления?

С наилучшими пожеланиями,

+0

Это не ясно из вашего кода, но делает insert_history все, что [manager.create()] (https://docs.djangoproject.com/en/1.4/ref/models/querysets/#create) не делает ? Если да, то какой пример функциональности? – ptr

+0

Да, он установит поле3, дату и время, основанное на некоторой логике, которую я напишу внутри «insert_history». –

+0

Надеюсь, вы действительно не вызываете свои поля 'field1',' field2' и 'field3' ...:) – Anentropic

ответ

10

Входит ли insert_history в себя? Или он создает новый объект истории?

Если он создает новый объект, я бы сделал это так:

class History(models.Model): 
    @classmethod 
    def insert_history(cls, field1, field2, field3): 
     # Here be code 

называть его

from app.models import History 
History.insert_history(field1, field2, field3) 

BTW, условное название для способа создания новых объектов является create. Кроме того, посмотрите на https://docs.djangoproject.com/en/1.9/ref/models/instances/#creating-objects

+0

insert_history создаст новый объект History. Я проверю ваш код. Спасибо –

+0

Спасибо. Это сработало! –

1

Просто выберите Историю экземпляр (например, с первичным ключом 1.):

hist = History.objects.get(pk=1) 

... и вызвать ваш метод с использованием hist переменными:

hist.insert_history(...) 
0

Для вставки данных в в модели истории я всегда буду использовать функцию insert_history.

Да, он установит field3, Задан, основанный на некоторой логики, что я буду писать в insert_history

Самый простой способ переопределить save method:

class History(models.Model): 
    field1 = models.ForeignKey(Request) 
    field2 = models.BooleanField() 
    field3 = models.DateTimeField() 

    def __unicode__(self): 
     return unicode(self.field1.id) # __unicode__ should return unicode, 
             # not string. 

    class Meta: # 
     ordering = ['-field3'] 

    def save(self, *args, **kwargs): 
     self.field3 = your calculated value 
     super(History, self).save(*args, **kwargs) 

Теперь, когда вы сохраняете свой метод - значение field3 будет тем, что является результатом вычисления в вашем пользовательском методе сохранения. Вам не нужно изменять что-либо в своих представлениях, чтобы это работало.

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