2nd [Hines]💫 4Day


3日目に発表されたPRで頂いたコメントで
  • の結果値をリストで囲んで返すのはなぜですか?
  • プロダクトオブジェクトのみを使用してimage urlを取得するように変更してください.

  • 1番
    :{}が1つ以上の場合は[]に戻ります.
    {}が1つの場合、すぐに{}として返されます.」
    グーグル(Google)でこの問題を解決します.

  • 2番
    :逆参照の概念が欠けているため、さらに学習した後、コードをproduct.image_set.all()に変更します.
  • 上記のコメントに基づいて修正されたコードは以下の通りです.👇)に等しい
    import json
    
    from django.http            import JsonResponse
    from django.views           import View
    
    from products.models        import Product
    
    class ProductDetailView(View):
        def get(self, request, product_id):
            try: 
                product = Product.objects.get(id=product_id)
    
                result = {
                            'name'                : product.name,
                            'price'               : product.price,
                            'brand'               : product.brand,
                            'description'         : product.description,
                            'thumbnail_image_url' : product.thumbnail_image_url,
                            'image_url'           : product.image_set.all()[0].image_url
                        }
                        
                return JsonResponse({'message' : result}, status=200)     
    
            except Product.DoesNotExist:
                return JsonResponse({'message' : 'PRODUCT_DOESNOT_EXIST'}, status=400) 
    上記のコメントを反映すると、
    午後の授業で勉強したunit testを作成しているうちに間違いが見つかりました.
    作成した製品のビュー.pyの修正が必要な箇所を見つけました.
    上記のコメントの修正を受けたコードでは、productのimageが1つしか返されません!!(どうしたの…?😱😱😱😱😱😱 この状態でunit testをしましたか...
    だから.
    for文を使用して空のリスト[]を作成し、複数の画像を含めることができます.
    append()関数を用いた論理の記述を決定する.
    (+他のlist compressionで更新!)
    次に、1つの製品画像のみを含むコードを修正する手順を書きます.
    まずimageをimage urlという変数に含める
    image_url = product.image_set.all() #--> QuerySet 형태
    空のlistの変数image resultを指定します.
    image_result = []
    まだあります.
    これで、for文でappend( )関数を空のリストで使用して論理を作成する場合、次のコード(変更前)を使用できます.👇)に等しい
    import json
    
    from django.http            import JsonResponse
    from django.views           import View
    
    from products.models        import Product
    
    class ProductDetailView(View):
        def get(self, request, product_id):
            try: 
                product = Product.objects.get(id=product_id)
                image_url  = product.image_set.all() #--> 쿼리셋[리스트형태]
                
                image_result = []
                for image in image_url: #--> 쿼리셋에서 한개씩 꺼내도, 그냥 객체가 꺼내져나옴...
                    image_result.append(image)
    シェルに確認され、image_urlQuerySet型です.
    for文で1つずつ取り出したのはオブジェクトです.
    上記のコードは、image_result変数が객체を直接含んでいる場合です.Jsonは、オブジェクトまたはクエリー・セットのタイプに変換できません.
    for文でimageをJsonが変換できる[ ]または{ }の形態に変換します!
    上記のコードを用いてfor文を記述したが、
    これはJson Serisable Errorを生み出した.
    だから、append( )関数を使用して、空のリストに入れます.
    すなわち,1つ1つの出現オブジェクトが持つ情報はimage_urlである.
    上記の状況により、
    修正後のコード👇)下図のように.
    import json
    
    from django.http            import JsonResponse
    from django.views           import View
    
    from products.models        import Product
    
    class ProductDetailView(View):
        def get(self, request, product_id):
            try: 
                product = Product.objects.get(id=product_id)
                image_url  = product.image_set.all() #--> 쿼리셋[리스트형태]
                
                image_result = []
                for image in image_url: #--> 쿼리셋에서 한개씩 꺼내도, 그냥 객체가 꺼내져나옴...
                    image_result.append(image.image_url)
    
    上のコードを除いて
    指導者
    誰でも変数名を見るだけです.
    変数にどのような値が含まれているかを知ってみましょう.
    変数名を変更したほうがいいです.
    このような提案を受け入れ、
    `image_url`     --> `images`
    `image_result`  --> `image_list`
    以下(👇)の写真とコードは変数名に対するコメントを反映しています.
    import json
    
    from django.http            import JsonResponse
    from django.views           import View
    
    from products.models        import Product
    
    class ProductDetailView(View):
        def get(self, request, product_id):
            try: 
                product = Product.objects.get(id=product_id)
                images  = product.image_set.all() #--> 쿼리셋[리스트형태]
                
                image_list = []
                for image in images: #--> 쿼리셋에서 한개씩 꺼내도, 그냥 객체가 꺼내져나옴...
                image_list.append(image.image_url)
    
                result = {
                             'name'                : product.name,
                             'price'               : product.price,
                             'brand'               : product.brand,
                             'description'         : product.description,
                             'thumbnail_image_url' : product.thumbnail_image_url,
                             'image_url'           : image_list
                      }
    
    		return JsonResponse({'message' : result}, status=200)     
    
    	  except Product.DoesNotExist:
          		return JsonResponse({'message' : 'PRODUCT_DOESNOT_EXIST'}, status=400) 
                
    製品データilビューの作成が完了すると、
    またunit testが行われました.
    対応するunit test codeを作成するすべてのプロセスを整理できません.
    私がミスしたところ、過程で発生したミス、解決?の合成は私のブログリンク(👇)添付ファイルとして.
    👀 レコードユニットテスト作成プロセス 👀
    <ちょっと待って.うなずくと…>
    uni testコードを記述する際に,画像に対してfor文を実行する理由を理解した.
    上にラベルを作成しました
    all()はQuerySet typeなので、jsonは変換できません.
    そこで、for文でオブジェクト(インスタンス)をJsonが変換できる形式listまたはdictionary typeに変換すべきであることを学びました.