如何更新 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 中的视图?
在更新 mysqlDatabase 内容时刷新 django 模板中的表内容