【问题标题】:Get Current User in Models获取模型中的当前用户
【发布时间】:2016-04-06 05:46:21
【问题描述】:

我正在处理一个在 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    

所以基本上在保存投资类时会创建一个发票对象,但是我想获取当前用户并将其设置为发票类中的用户字段。关于如何完成这项工作的任何想法?谢谢。

【问题讨论】:

  • 您应该在视图中执行此操作,即。 stackoverflow.com/questions/4865084/…
  • 感谢您的链接,但我希望在我的模型文件中实现这一点。因为我希望在投资结束时刷新数据库以便更新它,所以创建另一个 Invoice 对象

标签: python django django-models


【解决方案1】:

在模型范围内访问当前request 和当前request.user 是一种反模式。

MVC Architectural Pattern

基本上这些操作是在视图部分中完成的。 因此,最好将当前用户从负责任的角度传递出去,以节省投资或发票

【讨论】:

  • 我希望在我的模型中实现这一点,因为我希望在投资实例结束时刷新数据库以便自动更新它并创建另一个 Invoice 对象。
  • 酷,但我建议将 user 字段从 Invoice 移动到您的 Investment 模式,因为您已经通过 investment = models.ForeignKey(Investment) 获得了从 InvoiceInvestment 的链接。要从Invoice 访问user,您可以轻松使用invoice.investment.user
  • 是的,我实际上只是在一秒钟前才这样做,然后单击此帖子以查看任何新的解决方案。它有效!
【解决方案2】:

如果“当前用户”是指“request.user”,那么您可以从线程本地获取请求对象,但这不是一个好的做法。

Why is using thread locals in Django bad?

django-threadlocals为此提供了一个帮助程序以及有关它的更多信息。

过去它对我有用,但现在我会不惜一切代价避免它并坚持最佳实践并尽可能降低我的技术债务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2019-03-23
    • 2020-12-07
    • 2016-01-13
    相关资源
    最近更新 更多