私はインターンで、Ionicフレームワークを使用して同僚が作成したモバイルアプリと対話する必要があるDRF APIを開発するプロジェクトに取り組んでいます。 新しいユーザーを作成しています。私の見解方法は以下の通りです:一般的なビューのDjango REST APIカスタムメソッド
class NewUser(generics.CreateAPIView):
model = User
permission_classes = [permissions.AllowAny]
serializer_class = NewUserSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
token, created = Token.objects.get_or_create(user=serializer.instance)
return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=headers)
ユーザー名はその後、API 201ステータスコードを返し、JSONでトークン、まだ撮影されてhas't場合、ユーザー名はすでにそれを撮影した場合、誰かが、POSTリクエストを経由して、新規ユーザーを作成したい
JSONで400のステータスとエラーメッセージを返します。私の同僚は、すでに存在する名前のユーザー名を作成しようとすると、ステータスメッセージを200に変更するように要求します。彼はERRORレスポンスを消費することはできないと言います。 彼のコードは次のようになります。
$http.post(url,{
username:$scope.tel,
password:$scope.passwd
}).success(function(data){
alert(data);
$ionicLoading.hide();
console.log(data);
})
質問: 1)私はエラー '既に登録ユーザのための代わりに複数の論理400の200件のステータスを送信するために私のAPIを微調整する必要がありますか? 私のコードを変更しようとしましたが、DRFのCreateAPIView/ModelSerializerでオーバーライドするメソッドが見つかりませんでした。私はこの方法に私のビュークラスを書き換えてしまった:
@api_view(['POST'])
def newUser(request):
"""
Saves a new user on the database
"""
if request.method == 'POST':
serializer = NewUserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
token, created = Token.objects.get_or_create(user=serializer.instance)
return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_200_OK)
質問: 2)私は)どの方法私は 3をオーバーライドする必要があり、APIとresponce behaviorof変更したい場合は、私はジャンゴに新たなんだと、まだドン」私たちは一般的なビューを使用する必要があります知っている。 @ ....方法
ご注意いただきありがとうございますが、コードではシリアライザを作成する部分が欠落しています。だから、行のトークンにグローバル名が定義されていないというエラーがあります。created = Token.objects.get_or_create(user = serializer.instance) –
十分なことに、本当に重要なのはすべて応答ステータスの変更です。しかし、もう一度、あなたがここで心配するのが間違っているので、コードを複製することになります。シリアライザ 'save'の一環として' Token'の作成をして、ビュー内にこのビジネスロジックをまったく持っていないようにして、スーパークラスからコピー貼り付けコードを避けてください。 – John