【问题标题】:Django: method in models vs method in viewsDjango:模型中的方法与视图中的方法
【发布时间】:2017-07-17 23:39:01
【问题描述】:

我问自己这个问题,models.py 和views.py 中的方法有什么区别和性能更好?

示例 1:

models.py:

class Counter(models.Model):
    number = models.PositiveSmallIntegerField(default=0)

    def add_one(self):
        self.number += 1
        self.save()

views.py

from *xxx* import Counter

def count(request):
    c = Counter()
    c.add_one()
    c.save()
    return render(request, *xxx*)

示例 2:

models.py:

class Counter(models.Model):
    number = models.PositiveSmallIntegerField(default=0)

views.py

from *xxx* import Counter

def add_one(nb):
    nb += 1
    return nb

def count(request):
    c = Counter()
    c.number = add_one(c.number)
    return render(request, *xxx*)

我的例子有点简单,但是大方法和这么多变量在现实生活中有什么区别?

它对服务器的性能有影响吗?他有选择一种方式的传统或偏好吗?

【问题讨论】:

  • 为什么会有任何性能差异?代码就是代码,不管你把它放在哪里。
  • 第二个会快很多,因为你从不将它保存到数据库中,除了它们做同样的事情
  • 您可以阅读here 您有不同的可能性,它可以在框架上的不同级别上工作,它是否更快。我试图找到优化我的代码的好方法。

标签: django python-3.x django-models django-views


【解决方案1】:

这两种方法都是错误的!

正确的做法是

Counter.objects.filter(pk=some_id).update(number=F('number')+1)

请注意,需要这种方法来避免竞争条件。您当前的方法需要交易才能使其正常工作。像上面这样的代码通常会进入视图。

【讨论】:

  • 谢谢你的回答,但增量是一个简单的例子,在实践中我做了很多非常重复的过程,在用户的输入中进行了很多处理,然后将其保存在数据库中。所以我知道更新更好,但我发现一个例子很容易。
  • 在实践中“是”,您回复了我的示例。但这个问题只是理论上的:what the difference and the more performant between a method in models.py and views.py,如果我明白你说视图方法更好。
  • 您的两个 cmets 仍然无关紧要。因为您发布的代码只是错误的方法。我建议你发布另一个问题,但在你这样做之前。请阅读:stackoverflow.com/help/how-to-ask
  • 我不得不不同意“像上面这样的代码通常会进入视图”部分 - 这实际上取决于有效代码(不是 OP 提供的虚拟示例)真正做了什么,多少它实际上是域模型逻辑,因此应该封装在模型等中。就我而言,我更喜欢智能模型和哑视图(视图应该只处理用户->模型交互,而不是模型的内部逻辑)。
  • 是的,代码不只是适合所有人的代码。意识到这意味着你正在走向成功。万事如意
猜你喜欢
  • 2013-04-07
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2016-03-17
  • 2013-04-14
  • 2011-08-20
  • 2012-02-01
  • 2020-04-23
相关资源
最近更新 更多