🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

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

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Q&A

解決済

1回答

1442閲覧

django rest frameworkでImageFieldの値を返した時に起動サーバーのpathがつかない

tokushun109

総合スコア12

Django

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

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

0グッド

0クリップ

投稿2021/03/13 09:38

編集2021/03/14 08:07

前提・実現したいこと

前提

django rest frameworkを使用したアプリを作成しようとしております。
その中で、解決できない部分があったので知見のある方にご助力いただきたいと思っております。

実現したいこと

自作のapiをlocalにリクエストした時に、一方のimageFieldモデル(product_imageのimage)では
イメージ説明
http://localhost:8000/が先頭についていますが、

もうimageFieldモデル(logo)では
イメージ説明
のようにhttp://localhost:8000/が先頭についておりません。

できれば両方とも起動するサーバー(http://localhost:8000/)がついているように返却値を合わせたいと考えております。

(単純に後者にhttp://localhost:8000/の文字列を追加すれば解決すると思いますが、公式的なやり方とは思えなかったので質問させていただきました。)

該当のソースコード

現状の実装について記載いたします。(一部を抜粋)

models.py

python

1from django.db import models 2from django.utils import timezone 3 4import uuid 5 6 7class AccessoryCategory(models.Model): 8 ''' 9 アクセサリーカテゴリーモデル 10 ''' 11 class Meta: 12 verbose_name_plural = 'アクセサリーカテゴリー' 13 14 # アクセサリーカテゴリー名 15 name = models.CharField('アクセサリーカテゴリー名', max_length=120) 16 # 作成日 17 created_at = models.DateTimeField( 18 '作成日', auto_now_add=True) 19 # 更新日 20 updated_at = models.DateTimeField( 21 '更新日', auto_now=True) 22 23 def __str__(self): 24 return self.name 25 26 27class MaterialCategory(models.Model): 28 ''' 29 材料カテゴリーモデル 30 ''' 31 class Meta: 32 verbose_name_plural = '材料カテゴリー' 33 34 # 材料カテゴリー名 35 name = models.CharField('材料カテゴリー名', max_length=120) 36 # 作成日 37 created_at = models.DateTimeField( 38 '作成日', auto_now_add=True) 39 # 更新日 40 updated_at = models.DateTimeField( 41 '更新日', auto_now=True) 42 43 def __str__(self): 44 return self.name 45 46 47class SalesSite(models.Model): 48 ''' 49 販売サイトモデル 50 ''' 51 class Meta: 52 verbose_name_plural = '販売サイト' 53 54 # 販売サイト名 55 name = models.CharField('販売サイト名', max_length=120) 56 # url 57 url = models.URLField('販売サイトURL', max_length=200, null=False) 58 # 作成日 59 created_at = models.DateTimeField( 60 '作成日', auto_now_add=True) 61 # 更新日 62 updated_at = models.DateTimeField( 63 '更新日', auto_now=True) 64 65 def __str__(self): 66 return self.name 67 68 69class ProductImage(models.Model): 70 ''' 71 商品画像モデル 72 ''' 73 class Meta: 74 verbose_name_plural = '商品画像' 75 ordering = ['created_at'] 76 77 # uuid 78 uuid = models.UUIDField( 79 default=uuid.uuid4, editable=False, primary_key=True) 80 # 商品画像名 81 name = models.CharField('商品画像名', max_length=120) 82 # 商品画像 83 image = models.ImageField(verbose_name='商品画像', upload_to='images/') 84 # 作成日 85 created_at = models.DateTimeField( 86 '作成日', auto_now_add=True) 87 # 更新日 88 updated_at = models.DateTimeField( 89 '更新日', auto_now=True) 90 91 def __str__(self): 92 return self.name 93 94 95class Product(models.Model): 96 ''' 97 商品のモデル 98 ''' 99 class Meta: 100 verbose_name_plural = '商品' 101 ordering = ['created_at'] 102 103 # uuid 104 uuid = models.UUIDField( 105 default=uuid.uuid4, editable=False, primary_key=True) 106 # 商品名 107 name = models.CharField('商品名', max_length=120) 108 # 商品説明 109 description = models.TextField('商品説明') 110 # アクセサリーカテゴリー 111 accessory_category = models.ForeignKey( 112 AccessoryCategory, verbose_name='アクセサリーカテゴリー', on_delete=models.SET_NULL, null=True) 113 # 材料カテゴリー 114 material_category = models.ManyToManyField( 115 MaterialCategory, verbose_name='材料カテゴリー', null=True) 116 # 商品画像 117 product_image = models.ForeignKey( 118 ProductImage, verbose_name='商品画像', on_delete=models.SET_NULL, null=True) 119 # 販売サイト 120 sales_site = models.ManyToManyField( 121 SalesSite, verbose_name='販売サイト', null=True) 122 # 作成日 123 created_at = models.DateTimeField( 124 '作成日', auto_now_add=True) 125 # 更新日 126 updated_at = models.DateTimeField( 127 '更新日', auto_now=True) 128 129 def __str__(self): 130 return self.name 131 132 133class ProducerProfile(models.Model): 134 ''' 135 製作者プロフィールのモデル 136 ''' 137 class Meta: 138 verbose_name_plural = '製作者' 139 ordering = ['created_at'] 140 141 # 製作者名 142 name = models.CharField('製作者名', max_length=120) 143 # 紹介 144 introduction = models.TextField('製作者の紹介') 145 # 製作者のロゴ 146 logo = models.ImageField(verbose_name='ロゴ', upload_to='images/') 147 # 作成日 148 created_at = models.DateTimeField( 149 '作成日', auto_now_add=True) 150 # 更新日 151 updated_at = models.DateTimeField( 152 '更新日', auto_now=True) 153 154 def __str__(self): 155 return self.name 156

serializer.py

python

1from rest_framework import serializers 2from .models import Product, AccessoryCategory, MaterialCategory, SalesSite, ProductImage, ProducerProfile, SkillMarket, Sns 3 4 5class AccessoryCategorySerializer(serializers.ModelSerializer): 6 class Meta: 7 model = AccessoryCategory 8 fields = ('id', 'name') 9 10 11class MaterialCategorySerializer(serializers.ModelSerializer): 12 class Meta: 13 model = MaterialCategory 14 fields = ('id', 'name') 15 16 17class SalesSiteSerializer(serializers.ModelSerializer): 18 class Meta: 19 model = SalesSite 20 fields = ('id', 'name', 'url') 21 22 23class ProductImageSerializer(serializers.ModelSerializer): 24 class Meta: 25 model = ProductImage 26 fields = ('uuid', 'name', 'image') 27 28 29class ProductSerializer(serializers.ModelSerializer): 30 accessory_category = AccessoryCategorySerializer() 31 material_category = MaterialCategorySerializer(many=True) 32 product_image = ProductImageSerializer() 33 sales_site = SalesSiteSerializer(many=True) 34 35 class Meta: 36 model = Product 37 fields = ('uuid', 'name', 'description', 'accessory_category', 38 'material_category', 'product_image', 'sales_site') 39 40 41class ProducerProfileSerializer(serializers.ModelSerializer): 42 class Meta: 43 model = ProducerProfile 44 fields = ('name', 'introduction', 'logo') 45

views.py

python

1from django.shortcuts import get_object_or_404 2from rest_framework import generics, status, views 3from rest_framework.response import Response 4 5from .models import Product, AccessoryCategory, MaterialCategory, SalesSite, ProducerProfile, SkillMarket, Sns 6from .serializers import ProductSerializer, AccessoryCategorySerializer, MaterialCategorySerializer, SalesSiteSerializer, ProducerProfileSerializer, SkillMarketSerializer, SnsSerializer 7 8 9class ProductListAPIView(generics.ListAPIView): 10 ''' 11 商品モデルの取得(一覧)APIクラス 12 ''' 13 queryset = Product.objects.all() 14 serializer_class = ProductSerializer 15 16 17class ProducerProfileAPIView(views.APIView): 18 ''' 19 製作者モデルの取得APIクラス 20 ''' 21 22 def get(self, request, *args, **kwargs): 23 # pk=1の製作者のプロフィールを取得する 24 producer_profile = get_object_or_404(ProducerProfile, pk=1) 25 serializer = ProducerProfileSerializer(instance=producer_profile) 26 return Response(serializer.data, status.HTTP_200_OK) 27 28 29

urls.py

python

1from django.urls import path 2from .views import ProductListAPIView, ProductRetrieveAPIView, AccessoryCategoryListAPIView, MaterialCategoryListAPIView, SalesSiteListAPIView, ProducerProfileAPIView, SkillMarketListAPIView, SnsListAPIView 3 4urlpatterns = [ 5 path('product/', ProductListAPIView.as_view()), 6 path('producer_profile/', ProducerProfileAPIView.as_view()), 7]

試したこと

  • googleでimageFieldモデルのrespnseのpathを変更する方法を調べたが該当記事が見つかりませんでした。。。
  • django-rest-frameworkの公式ドキュメントを読んでみましたが、どこが該当する部分なのかがわかりませんでした。。。

予想としては、

product/がエンドポイントの時は、generics.ListApiviewを継承したメソッドを使用しており、
producer_profile/がエンドポイントの時はviews.APIViewを継承したメソッドを使用しているため、この違いが関係しているのでは?と考えております。

お手数をおかけしますが、ご教授いただけると幸いです。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決いたしました。

python

1class ProducerProfileAPIView(views.APIView): 2 ''' 3 製作者モデルの取得APIクラス 4 ''' 5 6 def get(self, request, *args, **kwargs): 7 # pk=1の製作者のプロフィールを取得する 8 producer_profile = get_object_or_404(ProducerProfile, pk=1) 9 serializer = ProducerProfileSerializer( 10 producer_profile, context={"request": request}) 11 return Response(serializer.data, status.HTTP_200_OK)

のようにキーワード引数でcontext={"request": request}を渡してあげたところ、

http://localhost:8000/

が先頭に着くようになりました。

投稿2021/03/14 08:12

tokushun109

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問