2015-12-26 2 views
1

У меня есть фрагмент кода, чтобы выбрать последнюю дату в таблице, а затем выполнить некоторую логику, чтобы получить новую дату. Где эта логика должна быть включена в проект django? Я видел примеры Fat Models, где логика ставится как метод модели, но это работает только на экземпляре, насколько я могу судить.Где поставить связанную с моделью логику в проекте Django, не связанную с экземпляром

# models.py 
class PurchasesDetails(models.Model): 
    purchaseid = models.AutoField(primary_key=True) 
    effectivedate = models.DateField() 

    def getselecteddate(self): 
     lastdate = PurchasesDetails.objects.filter().aggregate(Max('effectivedate')) 
     lastdate = next (iter (lastdate.values())) 
     thisweekday = lastdate.weekday() 
     advancedays = 1 
     if thisweekday ==4: 
      advancedays = 3 
     thisdate = (lastdate + timedelta(days=advancedays)) 

     return thisdate 
+0

возможно в [диспетчере моделей] (https://docs.djangoproject.com/en/1.9/topics/db/managers/)? – Pynchia

ответ

0

Как описано в official docs, model manager выглядит как самое лучшее место, где можно определить такую ​​логику

Определение пользовательских методов на модели, чтобы добавить пользовательские «на уровне строк» ​​ функциональность ваших объектов , Принимая во внимание, что методы Менеджера предназначены для , делайте «вещи в таблице», методы модели должны действовать на конкретную модель. экземпляр.

Это ценный метод ведения бизнес-логики в одном месте - модель.

Так, например, в вашем случае

class _DetailsManager(models.Manager): 

    def getselecteddate(self): 
     lastdate = PurchasesDetails.objects.filter().aggregate(Max('effectivedate')) 
     lastdate = next (iter (lastdate.values())) 
     thisweekday = lastdate.weekday() 
     advancedays = 1 
     if thisweekday == 4: 
      advancedays = 3 
     thisdate = (lastdate + timedelta(days=advancedays)) 

     return thisdate 

class PurchasesDetails(models.Model): 
    purchaseid = models.AutoField(primary_key=True) 
    effectivedate = models.DateField() 
    objects = _DetailsManager() 

new_date = PurchasesDetails.objects.getselecteddate() 

Пожалуйста, прочтите here конкретную документацию, посвященную настройке менеджеров модели.

+0

Спасибо, Пинчья. Должен ли класс _DetailsManager (models.Model) быть классом _DetailsManager (models.Manager)? Также я получаю сообщение об ошибке, что _DetailsManager не определен, когда я ссылаюсь на него в самой модели – Avagut

+0

Да, извините, я стрелял из своего дома, и я не закончил полностью редактирование. Что касается 'undefined', это действительно странно, он работает в моем коде. Если вы считаете, что мой ответ решает вашу проблему правильно и лучше, чем другие, отметьте ее как принятую. Спасибо. – Pynchia

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