Django:get_object_或_404不是正确的解决方案,但什么是正确的?
我正在努力找出正确的解决方案来解决我在这里要做的事情,我真的非常感谢你的帮助 目前,我有一个工作系统,它从数据库中获取一个“特殊”并将其显示在浏览器中。用户可以在浏览器中编辑该“特殊”,并将其提交给数据库。然后将该更改显示给用户 问题是,如果数据库中没有预先存在的“特殊”,则“特殊”不会更新。在my views.py中,我有:Django:get_object_或_404不是正确的解决方案,但什么是正确的?,django,Django,我正在努力找出正确的解决方案来解决我在这里要做的事情,我真的非常感谢你的帮助 目前,我有一个工作系统,它从数据库中获取一个“特殊”并将其显示在浏览器中。用户可以在浏览器中编辑该“特殊”,并将其提交给数据库。然后将该更改显示给用户 问题是,如果数据库中没有预先存在的“特殊”,则“特殊”不会更新。在my views.py中,我有: def changeSpecialOffer(theRequest): myProductUuid = theRequest.POST['myProductUui
def changeSpecialOffer(theRequest):
myProductUuid = theRequest.POST['myProductUuid']
myNewSpecialOffer = theRequest.POST['myNewSpecialOffer']
myProduct = get_object_or_404(Product, uuid=myProductUuid)
myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
active=True))
try:
myActiveSpecial.special = myNewSpecialOffer
myActiveSpecial.save()
except:
return HttpResponse(myActiveSpecial, mimetype='text/plain')
myActiveSpecial = SpecialOffer.objects.filter(product=myProduct).filter(
active=True)
return HttpResponse(myActiveSpecial, mimetype='text/plain')
我知道更新“特殊”不起作用的原因是get\u object\u或\u 404
正确返回404错误,因为数据库中没有预先存在的“特殊”
我已经尝试了一段时间,想找出最好的方法来解决这个问题,在数据库中存在“特殊”的情况下,不破坏函数
到目前为止,我已经尝试用try
和except
替换get\u object\u或
,但是我随后在save函数中遇到了问题,例如'unicode'没有属性“save()”
尝试替换:
myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
active=True))
与:
或者你可以试试这样:
try:
myActiveSpecial = SpecialOffer.objects.get(product=myProduct, active=True)
except SpecialOffer.DoesNotExist:
myActiveSpecial = SpecialOffer.objects.create(product=myProduct, active=True, ...something.more...)
如果您需要对刚刚创建的对象执行更多操作
编辑:
只是一个想法。。。将模型发送到HttpResponse
有点令人费解。也许您需要手动创建一个字符串,希望在HttpResponse
中返回该字符串。当然,当前的代码也可以工作。它隐式地调用模型的\uuuuuunicode\uuuu
方法
另一件事-在
返回之前重新获取myActiveSpecial
的原因是什么?我看不出这可能有任何影响。获取对象或404的方法是传入模型,然后进行一些查找。这与您所说的SpecialOffer.objects.get()
相同,但它不会引发异常,而是引发404
您第一次正确地使用了它,但第二次却没有
请尝试以下方法:
myProduct = get_object_or_404(Product, uuid=myProductUuid) # this is correct
myActiveSpecial = SpecialOffer.objects.filter(product=myProduct).filter(active=True))
if myActiveSpecial.count():
# There is one or more active specials!
else:
# There are no active specials for this product
还可以使用反向查找技巧(取决于模型的设置方式)
好的,现在我有了:myActiveSpecial=SpecialOffer.objects.filter(product=myProduct.filter(active=True)返回HttpResponse(myActiveSpecial,mimetype='text/plain')
但它似乎是循环的。你能更具体地说,什么是“循环的循环”真的是什么意思?另外,在我看来,您根本不需要重新获取myActiveSpecial
。对不起,这不是很好的描述!基本上,用于更改特殊值的JS函数会正确返回新值,但新值不会保存在db中。重新加载页面后,将显示旧的特殊页面。如果你再次尝试更新特辑,它似乎会将新的特辑附加到旧的特辑上。。。但是仍然没有保存。我认为这与创建新的特殊设置时没有设置“active”值有关。我认为在这种情况下,myActiveSpecial.exists()
比myActiveSpecial.count()更好。
myProduct = get_object_or_404(Product, uuid=myProductUuid) # this is correct
myActiveSpecial = SpecialOffer.objects.filter(product=myProduct).filter(active=True))
if myActiveSpecial.count():
# There is one or more active specials!
else:
# There are no active specials for this product
myActiveSpecial = myProduct.specialoffer_set.filter(active=True)