5

ここでやろうとしていることの正しい解決策を見つけるのに苦労しています。助けていただければ幸いです。

現時点では、データベースから「スペシャル」を取得してブラウザに表示する作業システムがあります。ユーザーはブラウザでその「スペシャル」を編集し、データベースに送信できます。その後、その変更がユーザーに表示されます。

問題は、データベースに既存の「特別」がない場合、「特別」が更新されないことです。私の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')

「Special」の更新が機能しない理由はget_object_or_404、データベースに既存の「Special」がないため、 が 404 エラーを正しく返すためであることを知っています。

データベースに既存の「スペシャル」がある場合、関数を壊さずにこの問題を回避する最善の方法を考え出そうとしばらく試みてきました。

これまで、 を と に置き換えてみましたget_object_or_404try、 .exceptなどの保存機能で問題が発生しました'unicode' has no attribute 'save()'

4

2 に答える 2

3

置き換えてみてください:

myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
                                                    active=True))

と:

myActiveSpecial, just_created = SpecialOffer.objects.get_or_create(product=myProduct, 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。もちろん、現在のコードも機能します。__unicode__モデルのメソッドを暗黙的に呼び出します。

myActiveSpecialもう 1 つ - の直前にを再フェッチする理由は何returnですか? これによる影響は見られません。

于 2012-08-12T13:18:42.287 に答える
1

機能する方法get_object_or_404は、モデルを渡し、次にいくつかのルックアップを行うことです。あなたが言っSpecialOffer.objects.get()たのと同じですが、例外を発生させる代わりに、 を発生させ404ます。

最初は正しく使用しましたが、2 回目は正しく使用しませんでした。

代わりにこれを試してください:

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)
于 2012-08-12T13:28:00.630 に答える