2016-01-01 15 views
0

Я работаю над проектом с классом инвестиций и счетов в models.py. Способ, которым они работают, заключается в том, что пользователь вкладывает инвестиции, а при сохранении модели инвестиций создается счет-фактура. Вот соответствующий код:Получить текущего пользователя в моделях

class Investment(models.Model): 
    ... 
    def save(self, *args, **kwargs): 
      current_investment = Investment.objects.get(pk=self.pk) 
      create_invoice = Invoice.objects.create(investment=current_investment, 
                fee_type='Mngmt.', 
                amount=self.amount*fee_amount) 

class Invoice(models.Model): 
    user = models.ForeignKey(User) 
    investment = models.ForeignKey(Investment) 
    fee_type = models.CharField(max_length=24) 
    amount = models.DecimalField(max_digits=12, decimal_places=2, default=0) 
    date = models.DateTimeField(default=timezone.now, blank=True) 

    def __str__(self): 
     return self.investment.fund.name  

Так в основном, когда инвестиционный класс сохранен объект Invoice создается, однако я хочу, чтобы получить текущий пользователь и установить его на поле пользователя в классе счетов. Любые идеи о том, как я могу это сделать? Благодарю.

+0

Вы должны сделать это в представлении, т.е. http://stackoverflow.com/questions/4865084/set-form-author-field-to-logged-in-user-before-render – jpic

+0

Спасибо за ссылку, но я надеялся достичь этого моего файла модели. Поскольку я надеюсь обновить базу данных, когда инвестиция закончилась, чтобы обновить ее, создайте другой объект счета-фактуры. – ng150716

ответ

0

Это как-то анти-шаблон для доступа к току request и текущему request.user в объеме модели.

MVC Architectural Pattern

В основном эти операции выполняются в пределах видимости секций. Так что лучше передать текущего пользователя из ответственного представления для экономии инвестиций или счета-фактуры

+0

. Я надеялся достичь этой модели, поскольку я надеюсь обновить базу данных, когда инвестиционный экземпляр закончился, чтобы для его обновления автоматически создается другой объект счета-фактуры. – ng150716

+0

Прохладный, но я рекомендую переместить поле 'user' из' Invoice' в ваш 'Investment' Mode, l, поскольку у вас уже есть ссылка из' Invoice' на 'Investment' через' investment = models.ForeignKey (Investment) '. Чтобы получить доступ к 'user' из' Invoice', вы можете легко использовать 'invoice.investment.user' – kia

+0

Да, я буквально только что сделал это секунду назад, прежде чем нажимать на это сообщение, чтобы увидеть любые новые решения. Оно работает! – ng150716

0

Если «текущий пользователь» означает «request.user», то вы можете получить объект запроса из локалей потоков, но это не так. считается хорошей практикой.

Why is using thread locals in Django bad?

django-threadlocals предоставляет помощника для этого и больше информации о нем тоже.

Это работало для меня в прошлом, но в настоящее время я избегаю этого любой ценой и придерживаюсь лучших практик и сохраняю свой технический долг как можно ниже.

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