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" из представления?

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

Ответ 1

Использует ли insert_history self? Или он создает новый объект истории?

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

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)

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

Ответ 3

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

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

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

hist.insert_history(...)

Ответ 4

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

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

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

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 значение будет тем, что является результатом вычисления в вашем пользовательском методе сохранения. Вам не нужно изменять что-либо в своих представлениях, чтобы это работало.