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

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

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

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

Python

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

Q&A

解決済

1回答

392閲覧

django REST frameworkでJsonobjectを作成するAPIの作成

taro_yamada

総合スコア55

Django

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

Python

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

0グッド

0クリップ

投稿2018/11/05 22:36

編集2018/11/06 15:31

django REST framework でJsonArrayではなく、JsonObjectを送るAPIを作りたいのですが、上手くできません。
どなたか解決方法をご教示いただけないでしょうか?

serializers.py

python

1class InfoSerializer(serializers.ModelSerializer): 2 class Meta: 3 model = Info 4 fields = ('code', 'name', 'yoso') 5

models.py

python

1class Info(models.Model): 2 code = models.CharField(verbose_name='code', max_length = 4) 3 4 name = models.CharField(verbose_name='名前', max_length = 20, null = True) 5 6 yoso = models.CharField(verbose_name='予想', max_length = 20, null = True) 7 day = models.DateField(verbose_name='日',null = True) 8 9

apis.py

python

1class InfoViewSet(viewsets.ModelViewSet): 2 queryset = Info.objects.filter(day__range=[datetime.datetime.now()-datetime.timedelta(days=10), datetime.datetime.now()+datetime.timedelta(days=60)]).all() 3 serializer_class = InfoSerializer

urls.py

python

1router.register(r'info', apis.InfoViewSet) 2urlpatterns = [ 3 path('api/', include(router.urls)), 4]

<送信されるデータ>
[{"code":"1111","name":"abcde","yoso":null}]

javaでJSONObjectとして受け取りたいのですが、配列形式になっているため、受け取れずに困っています。

java側で、JSONArrayからJSONObjectに変換しようと思ったのですが、こちらも上手く作ることができませんでした。

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

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

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

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

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

gh640

2018/11/06 01:14

ご提示されているリンク先は `djangorestframework-jsonapi` というパッケージのもので、 Django REST Framework 本体とは別なのかなと思います。実際には Django REST Framework でやろうとされているのかプラスアルファのものを使おうとされているのかどちらでしょう? Django REST Framework 本体であればドキュメントサイトは https://www.django-rest-framework.org/ かと思います。
gh640

2018/11/06 01:22

どのようなレスポンスが生成されるかはシリアライザだけでなく view によっても決まるので、該当する view のコードもあわせてご共有されると有益な回答が得られやすいかと思います。加えて、対応するルーティング設定(=該当する `path()` の行)と、「<送信されるデータ>」が確認できたときのアクセスパスもあるとよりよい気がします。問題の原因が model にあることはまず無いかなという印象はありますが、 model の方で何か特殊なことをしている場合は model も共有されるとよいかもしれません。
taro_yamada

2018/11/06 14:11

ご指摘ありがとうございます。質問を修正してみました。どちらかというと受け取るjava側の問題かもしれません・・・・
gh640

2018/11/06 14:52 編集

パッと拝見した印象では、対象の view 関数 `get_start` は定義されている `InfoSerializer` を使っていないように見えますが、これが本当に対象の view でしょうか? posts/result.html の中身を見ないことには正確なことは言えませんが、 `get_start` が「<送信されるデータ>」のような内容を返すのは当然のようにも思えます。というのは、変数 `data` を `print(list(data))` 等としてコンソール等に出力されるとわかりますが、 `data` は `django.db.models.query.QuerySet` であり複数の `Info` インスタンスを格納しているためです。 JSONObject よりは Array で出てくるのがむしろ自然のような気がしますが、いかがでしょう。
taro_yamada

2018/11/06 15:33

大変失礼しました。間違えて、テスト用に作ったHTMLファイルのプログラムを出してしまいました。しかし、何れにしても、問題点は同様の気がします。この場合、INFOインスタンスでなく、オブジェクトを配列でない状態で返すにはどのようにすればよいでしょうか?
gh640

2018/11/07 01:38

いえ、ご共有いただきありがとうございます。返信コメントを書いていたら長くなってしまいましたので、今回は回答欄に記入させていただきました。そちらをご覧ください。
gh640

2018/11/07 01:40

「この場合、INFOインスタンスでなく、オブジェクトを配列でない状態で返す」がちょっとわからないのですが、ここで「この場合」は `get_start` のことですか?それとも `InfoViewSet` の場合ですか?
guest

回答1

0

ベストアンサー

ModelViewSet を使ってらっしゃるということは、エンドポイントといいますかアクセス URL はまとめて作られている状態ですね。この場合、生成された一連のルーティング設定( urlpatterns )はどのようになっていて、そのうちどのパターンにアクセスすれば単一の Info の情報が返されるか、というのはおわかりになりますか?(ちなみによくわからなくて改めて確認されたい場合は django-extensions パッケージの show_urls コマンド等が役に立ちます: https://stackoverflow.com/questions/1275486/django-how-can-i-see-a-list-of-urlpatterns

私の認識が正しければ、例えば、ご提示いただいた urls.py がルートの urls.py である場合、パス /api/info/ にアクセスすると Info のリスト(つまり配列)が、パス /api/info/[id]/ にアクセスすると単一の Info (つまり object )が JSON で返ってくるはずです。

ということで最初の質問に戻るのですが、どういうパスにアクセスしたときに「<送信されるデータ>」が確認できるのでしょうか?

……ここまで来ると、どういう状況か把握されて問題が解決するのではないかと思っています。いかがでしょう。

もし /api/info/[id]/ にアクセスしているのに結果が array で返ってきてしまうということであれば、続くデバッグの仕方としては rest_framework.mixins.ListModelMixinrest_framework.views.APIView という風によりシンプルな view クラスを継承する形に切り替えていって様子を見る、という風になるのではないかと思います。 Django REST Framework が何をしているのかよくわからなくてハマってしまう、という感じであればいったん関数ベースの view 定義に切り替えて実装された方が近道かなと思います。

投稿2018/11/07 01:37

gh640

総合スコア1407

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

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

taro_yamada

2018/11/07 11:25

非常にわかりやすい回答で本当にありがとうございました。 確かに、私が書いた<送信されるデータ>は誤っていて、複数のデータを呼び出した際に配列で表示されてしまっています。 さて、ここで、質問になってしまうのですが、やはり、複数のobjectを返す際には、配列にせざるを得ないのでしょうか?
gh640

2018/11/07 23:18

そうでしたか。よかったです。 > 複数のobjectを返す際には、配列にせざるを得ないのでしょうか? 複数の object を配列以外で表現するというのは具体的にはどのようなイメージでしょう?キーが id で値が各 `Info` を表すハッシュ(= object )等ですか? 私の理解が正しければ、おそらく Django REST Framework (以下 DRF )にはそれを実現するずばりな機能は無いので、 DRF を使うのであれば一部のクラスを継承・アトリビュートを上書きしたりして実現する形になるものと思います。
taro_yamada

2018/11/10 03:37

その通りです。 元々、作成していたAndroidアプリで、JSONオブジェクトから読み込むというプログラムだったので、そのまま流用できるようにAPIをカスタマイズしたかったのですが・・・ アンドロイドの方を修正することでなんとか実現できそうです。 どうもありがとうございました。
gh640

2018/11/10 12:14

ご状況をご共有くださりありがとうございます。なるほど、そうでしたか。 Android アプリの方で対応される形になったのですね。ともあれ問題が解決される方向に向かっているとのことでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問