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
Ответ 2
Я думаю, что для этих проблем наиболее целесообразно использовать пользовательский менеджер https://docs.djangoproject.com/en/dev/topics/db/managers/.
Ответ 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
значение будет тем, что является результатом вычисления в вашем пользовательском методе сохранения. Вам не нужно изменять что-либо в своих представлениях, чтобы это работало.