TIL 21: [Django ORM) update_or_create(), get_or_create()

6921 ワード

class CartView(View):
    @authentication
    def post(self, request):
        data            = json.loads(request.body)
        current_user_id = request.user

        try:
            user_id           = current_user_id
            product_id        = data['product_id']
            purchase_quantity = data['quantity']

            if not Product.objects.filter(id = product_id).exists():
                return JsonResponse( {'MESSAGE' : 'PRODUCT DOES NOT EXIST'}, status = 400)

            if Cart.objects.filter(user_id = user_id, product_id = product_id).exists():
                current_product                    = Cart.objects.get(product_id = product_id, user_id = user_id)
                current_product.purchase_quantity += int(purchase_quantity)
                current_product.save()

            else:
                Cart.objects.create(
                    user_id           = user_id,
                    product_id        = product_id, 
                    purchase_quantity = purchase_quantity
                    )
以上のコードは、プロジェクトでコメントを受け入れるコードの一部です.最初の項目ではショッピングバスケットの機能を創造し、商品IDがショッピングバスケットに存在する場合は、ショッピングバスケットの対応する商品に追加し、商品IDが存在しない場合は、ショッピングバスケットの新しい商品を追加する機能を体現する.その結果,上記のコードで実装されたが,検索中にupdate or createがget or createのORMであることが分かった.

get_or_create


このメソッドは(object,created)というtuple形式で返されます.
最初のパラメータ(object)は、取り出すモデルインスタンスです.
2番目のパラメータ(created)は、TRUEまたはFALSEを有するboolean flagである.
インスタンスがget or createメソッドによって作成された場合、TRUEは、インスタンスがデータベースに存在する場合、FALSE値を有する.
order, created = Order.objects.get_or_create(user_id = user.id, status_id = IN_CART_STATUS_ID)

update_or_create


上記の方法と似たような方法で動作します.
インスタンスが存在する場合は、値が更新されます.
存在しない場合は、インスタンスを作成します.
obj, created = Person.objects.update_or_create(
    first_name='John', last_name='Lennon',
    defaults={'first_name': 'Bob'},
)
参考資料:https://docs.djangoproject.com/en/3.2/ref/models/querysets/