如何更新 Django 中的数据库?

Posted

技术标签:

【中文标题】如何更新 Django 中的数据库?【英文标题】:How can I update the database in Django? 【发布时间】:2020-06-08 21:54:57 【问题描述】:

我正在构建一个 Web 服务并尝试更新我的数据库,但显然这不是正确的方法。我可以在这里帮忙吗,我已经尝试了所有的变化。我收到此错误:分配前引用了局部变量“打印机”。我尝试将名称更改为 PrinterObj,但随后出现错误:PrinterObj 没有保存方法。我想要做的是保存到一个新记录,如果它不存在并且如果它存在我想更新。我认为应该很简单。

from .models import Printer

class RequestData(APIView):
  permission_classes = (IsAuthenticated,)

  def get(self, request):
    Printer = Printer.objects.get(printername = printername)
    if Printer: #UPDATE
        Printer.printername = printername
        Printer.ip = request.META['REMOTE_ADDR']
        Printer.lastupdate = datetime.now()
        Printer.save()
    else: #CREATE
        b = Printer(
            printername = printername, 
            ip = request.META['REMOTE_ADDR'],
            lastupdate = datetime.now()
        )
        b.save()

【问题讨论】:

你正在隐藏你自己的变量 Printer = Printer.objects... 【参考方案1】:

发生这种情况的原因是因为您指定了Printer = …,因此Printer 是一个局部变量,更糟糕的是,您在表达式的右侧使用了Printer,因此在分配之前使用它它。

解决方案是给 object 一个与类不同的名称。因此在 Python 中,局部变量通常用小写字母书写。

如果找不到对象,.get() 会引发错误。你可以使用.first(..),甚至更好,使用update_or_create(..)

class RequestData(APIView):
  permission_classes = (IsAuthenticated,)

  def get(self, request):
    Printer.objects.update_or_create(
        printername=printername,
        defaults=
            'ip': request.META['REMOTE_ADDR'],
            'lastupdate': datetime.now()
        
    )
    return …

您仍然需要返回一个 HTTP 响应,例如 JsonResponse('success': true)。此外,GET 请求应该有副作用,因此使用def get(...) 创建或更新对象可能不是一个好主意。

【讨论】:

谢谢,这看起来更好。我现在很累尝试。我明天会做。 它就像一场梦一样感谢您花时间学习我的正确方法。是的,我在底部有一个 JsonResponse。

以上是关于如何更新 Django 中的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使按钮单击更新数据库并重定向到 Django 中的视图?

如何使用 django 更新会计应用程序中的余额?

在更新 mysqlDatabase 内容时刷新 django 模板中的表内容

表中的Django数据更新

如何通过简单地单击没有任何形式的按钮来更新 django 模型的数据?

在 Django 中安排表更新