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

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

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

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

473閲覧

DjangoのRestFrameworkで、PUT するたびにFileFieldに保存していたファイルパスが消えてしまう

kaorimanabe

総合スコア13

Django

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/07/25 03:21

編集2022/01/12 10:55

問題

PUTするたびに、FileFieldのファイルパスが消えてしまう

目的

DjangoRestFrameworkのAPIに、PUTメソッドで、Questionテーブルのデータをupdateしたい。

詳細

id, sentence, voiceのそれぞれのフィールドにすでにデータが入っている状態にて、
sentenceだけを変更して、ブラウザのGUI上でPUTメソッド送った際に、voiceフィールドに入っていたファイルパスが削除されてしまいます。
この状態だと、sentenceだけを変更したくても、毎回voiceのファイルもputしなくてはならないので、既存のファイルパスがPUTのたびに削除されないように修正したいです。
※ ファイルをputすれば、保存されます。

コード

  • models.py
from django.db import models class Question(models.Model): id = models.AutoField(primary_key=True) sentence = models.CharField(max_length=255, null=True, blank=True) voice = models.FileField(upload_to='voice/', blank=True, null=True)
  • views.py
from rest_framework import viewsets, filters from rest_framework.viewsets import ModelViewSet from .models import Questionn from .serializer import QuestionSerializer class QuestionTestViewSet(viewsets.ModelViewSet): queryset = Question.objects.all() serializer_class = QuestionSerializer
  • serializer.py
from rest_framework import serializers from core.models import Question class QuestionSerializer(serializers.ModelSerializer): class Meta: model = Question fields = ('id', 'sentence', 'voice')

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

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

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

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

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

guest

回答1

0

PUTは基本的にリソースの「新規作成」か「置き換え」に使います。このため、既存のリソースに対してPUTしたときにvoiceを省略してしまうと、voiceのないデータでリソースが上書きされる、という挙動になっていると思われます。

そこで、PATCHを使う事になります。
残念ながらPATCHでの動作についてDjango Rest Frameworkのドキュメントの記述を見つけられませんでしたが、もしかしたらPATHメソッドにするだけで期待の動作になるかもしれません。

調べてる中で別のドキュメントを見つけたんですが、Serializerのインスタンス化で partial=True を指定すると一部のフィールドだけを保存できるシリアライザになるようです。この方向で対応できるのかもしれません(実際に実装してみてはいないので、ただの期待です)。
http://www.django-rest-framework.org/api-guide/serializers/#partial-updates

投稿2017/07/25 12:49

shimizukawa

総合スコア1847

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問