Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:get_object_或_404不是正确的解决方案,但什么是正确的?_Django - Fatal编程技术网

Django:get_object_或_404不是正确的解决方案,但什么是正确的?

Django:get_object_或_404不是正确的解决方案,但什么是正确的?,django,Django,我正在努力找出正确的解决方案来解决我在这里要做的事情,我真的非常感谢你的帮助 目前,我有一个工作系统,它从数据库中获取一个“特殊”并将其显示在浏览器中。用户可以在浏览器中编辑该“特殊”,并将其提交给数据库。然后将该更改显示给用户 问题是,如果数据库中没有预先存在的“特殊”,则“特殊”不会更新。在my views.py中,我有: def changeSpecialOffer(theRequest): myProductUuid = theRequest.POST['myProductUui

我正在努力找出正确的解决方案来解决我在这里要做的事情,我真的非常感谢你的帮助

目前,我有一个工作系统,它从数据库中获取一个“特殊”并将其显示在浏览器中。用户可以在浏览器中编辑该“特殊”,并将其提交给数据库。然后将该更改显示给用户

问题是,如果数据库中没有预先存在的“特殊”,则“特殊”不会更新。在my views.py中,我有:

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)