質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

integer

integerは、一般的に整数を表します。プラスやマイナス、ゼロもなりうる全ての数です。(例 : -2, -1, 0, 1, 2...)

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1497閲覧

int値をsaveするために、モデルフィールドではなくモデルインスタンスで保存を実行する方法が知りたいです。

momonga8316

総合スコア2

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

integer

integerは、一般的に整数を表します。プラスやマイナス、ゼロもなりうる全ての数です。(例 : -2, -1, 0, 1, 2...)

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/28 12:54

編集2021/08/28 12:55

実現したいこと

商品=カニがカートに入れられたら、カニ商品データ(Crabdb.model)から在庫数を取得して、カニの在庫数を一つ減らして新たに在庫数を保存したいです。

発生している問題・エラーメッセージ

'int' object has no attribute 'save'

該当のソースコード

django

1 2from django.shortcuts import render, redirect, get_object_or_404 3from django.http import HttpResponse, Http404, JsonResponse 4from django.contrib import messages 5from django.contrib.auth.decorators import login_required 6from django.contrib.auth.models import User 7from django.core.paginator import Paginator 8from ECrab.models import Profile, Crabdb, Cart 9 10import random 11 12def list_view(request): 13 Crabdb_list = Crabdb.objects.all().order_by('-id') 14 paginator = Paginator(Crabdb_list, 20) 15 16 try: 17 page = int(request.GET.get('page')) 18 except: 19 page = 1 20 21 posts = paginator.get_page(page) 22 return render(request, 'ECrab/post_list.html', {'posts': posts, 'page': page, 'last_page': paginator.num_pages}) 23 24def detail_view(request, post_id): 25 post = get_object_or_404(Crabdb, id=post_id) 26 27 try: 28 page = int(request.GET.get('from_page')) 29 except: 30 page = 1 31 return render(request, 'ECrab/post_detail.html', {'post': post, 'page': page }) 32 33def edit_cart(request, post_id): 34 35 post = get_object_or_404(Crabdb, id=post_id) 36 37 try: 38 page = int(request.GET.get('from_page')) 39 except: 40 page = 1 41 42 user_id = request.user.id 43 44 previous_cart = Cart.objects.filter(user_id=user_id, product_id=post_id) 45 46 if previous_cart.exists(): 47 48 previous_cart.delete() 49 else: 50 product = Cart(user_id=user_id, product_id=post_id) 51 product.save() 52 53 #在庫数を取得 54 x = Crabdb.objects.get(id=post_id) 55 stock_quality = x.stock 56 if stock_quality > 0: #在庫がある場合 57 stock_quality -= 1 #在庫を一つ減らす 58 stock_quality.save() 59 else: 60 print("在庫がありません") 61 62 return render(request, 'ECrab/post_detail.html', {'post': post, 'page': page }) 63 64

試したこと

stock_quality=stockはCrabdbモデルのデータの一部の整数だから、
モデルフィールドではなく、モデルインスタンスで保存を実行する必要がある。という文章を見つけました。

そのため、12行目のようにしてみたのですが、そしたらsave() missing 1 required positional argument: 'self'
とエラーが出てきました。

django

1・・・ 21 else: 32 #無ければユーザID・商品IDの組をカートに追加 43 #productはCartクラスのインスタンス 54 product = Cart(user_id=user_id, product_id=post_id) 65 product.save() 76 87 #在庫数を取得 98 x = Crabdb.objects.get(id=post_id) 109 stock_quality = x.stock 1110 if stock_quality > 0: #在庫がある場合 1211 stock_quality -= 1 #在庫を一つ減らす 1312 Crabdb.save() #モデルインスタンスで保存してみた 1413 else: 1514 print("在庫がありません")

djangoを始めたばかりで、引数などを理解していないから起こっているエラーだとは思います。
解決方法を教えてもらえると助かります。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Mac M1
shell zsh
python,django

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

生成したインスタンスの方で save()を使用するのが正しいのかなと思いました。

python

1・・・ 21 else: 32 #無ければユーザID・商品IDの組をカートに追加 43 #productはCartクラスのインスタンス 54 product = Cart(user_id=user_id, product_id=post_id) 65 product.save() 76 87 #在庫数を取得 98 x = Crabdb.objects.get(id=post_id) 109 stock_quality = x.stock 1110 if stock_quality > 0: #在庫がある場合 1211 stock_quality -= 1 #在庫を一つ減らす 1312                x.stock = stock_quality 1413 x.save() # Crabdbではなくxでsave()を使用する 1514 else: 1615 print("在庫がありません")

投稿2021/08/28 15:22

holy_

総合スコア364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momonga8316

2021/08/28 15:34

教えていただいた方法を実行したところ、エラー文は出なくなりました!ありがとうございます! しかし、、、、在庫に反映されないという現象が起こってしまいました・・・。管理ページに移っても在庫は減っていません。 htmlでの在庫数を「在庫数:{{ post.stock }}」と表示しているのが原因か、はたまた何かコードが違うのでしょうか。。。すみません、質問ばかりしてしまい。
momonga8316

2021/08/28 15:39

shellコマンドでレコードの取得、変更、保存を試してみました。 x.save() で試したところ、stock_quality(在庫数)は変化していませんでした。
holy_

2021/08/28 15:49

DBが更新されているかも確認してみてください Crabdbクラスのコードも見てみたいです
holy_

2021/08/28 15:55

更新する前のデータを渡してるので画面には更新してないように見えるのかもしれません。 #在庫数を取得の処理をpost取得する前行うようにしてみてください
momonga8316

2021/08/28 16:34 編集

CrabdbおよびCartクラスのmodels.pyです。 ``` class Crabdb(models.Model): class Meta: verbose_name = 'カニデータ' verbose_name_plural = 'カニデータ' id = models.CharField('カニID',max_length=6,primary_key=True) # 'A00001' type = models.CharField('カニの種類',max_length=30) # 'ケガニ' area = models.CharField('生産地',max_length=30) # '北海道' weight = models.IntegerField('重さ') stock = models.IntegerField('在庫数',default=0) price = models.FloatField('カニの値段') delivery_date = models.IntegerField('お届け日') owner = models.ForeignKey(Profile, verbose_name='所有者', null=True, blank=True, on_delete=models.CASCADE ) def __str__(self): return self.id class Cart(models.Model): class Meta: verbose_name = 'カートデータ' verbose_name_plural = 'カートデータ' user_id = models.CharField('ユーザーID',max_length=6) # 'B00001' product_id = models.CharField('商品ID',max_length=6) # 'A00001' timestamp = models.DateTimeField('追加日時', auto_now_add=True) #カートに追加時の現在時刻'13:15' def __str__(self): return self.user_id + ' ' + self.product_id ```
momonga8316

2021/08/28 17:03

>#在庫数を取得の処理をpost取得する前行うようにしてみてください 実行してみましたが、管理画面および表ページでも変化ありませんでした(T.T)
holy_

2021/08/29 05:33

申し訳ないですが原因はわからなかったです。正直ほかにおかしいところ見当たらないです、、
momonga8316

2021/08/29 07:00

holy_さん ``` else: #無ければユーザID・商品IDの組をカートに追加 #productはCartクラスのインスタンス product = Cart(user_id=user_id, product_id=post_id) product.save() x = Crabdb.objects.get(id=post_id) if x.stock > 0: #在庫がある場合 x.stock -= 1 #在庫を一つ減らす x.save() #モデルインスタンスで保存 print("成功しました") else: print("在庫がありません") return render(request, 'ECrab/post_detail.html', {'post': post, 'page': page }) ``` こちらに変更したところ、在庫を減らすことができました。 たくさん回答していただきありがとうございました!mm
guest

0

自己解決

django

1・・・ 2(略) 3 4else: 5#無ければユーザID・商品IDの組をカートに追加 6#productはCartクラスのインスタンス 7product = Cart(user_id=user_id, product_id=post_id) 8product.save() 9 10x = Crabdb.objects.get(id=post_id) 11 12stock_quality = x.stock  ←置き換えた部分を消す 13 14if x.stock > 0: #在庫がある場合 15x.stock -= 1 #在庫を一つ減らす 16x.save() #モデルインスタンスで保存 17print("成功しました") 18else: 19print("在庫がありません") 20 21return render(request, 'ECrab/post_detail.html', {'post': post, 'page': page })

投稿2021/08/29 07:02

momonga8316

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問