Django:get_object_or_404不是正确的解决方案,但它是什么?

Erv*_*879 5 django

我正在努力找到正确的解决方案,我正在努力做到这一点,并且非常感谢一些帮助.

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

问题是如果数据库中没有预先存在的"特殊",则"特殊"将不会更新.在我的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')
Run Code Online (Sandbox Code Playgroud)

我知道更新"特殊"不起作用的原因是因为get_object_or_404正确返回404错误,因为数据库中没有预先存在的"特殊".

我已经尝试了一段时间来找出解决这个问题的最佳方法,而不会破坏数据库中存在"特殊"的情况下的功能.

到目前为止,我已经尝试更换get_object_or_404with tryexcept,但是我遇到了保存功能的问题,例如'unicode' has no attribute 'save()'.

frn*_*nhr 3

尝试更换:

myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
                                                    active=True))
Run Code Online (Sandbox Code Playgroud)

和:

myActiveSpecial, just_created = SpecialOffer.objects.get_or_create(product=myProduct, active=True)
Run Code Online (Sandbox Code Playgroud)

或者你可以尝试这样的事情:

try:
    myActiveSpecial = SpecialOffer.objects.get(product=myProduct, active=True)
except SpecialOffer.DoesNotExist:
    myActiveSpecial = SpecialOffer.objects.create(product=myProduct, active=True, ...something.more...)
Run Code Online (Sandbox Code Playgroud)

如果您需要对刚刚创建的对象执行更多操作。

编辑:

只是一个想法...将 Model 发送到 有点令人费解HttpResponse。也许您需要手动创建一个您希望在HttpResponse. 当然,当前的代码也可以工作。它隐式调用__unicode__模型的方法。

myActiveSpecial另一件事 - 重新获取之前的原因是什么return?我没有看到这可能产生任何影响。