Djangorestframeworkを使用して単純なgetAPIを呼び出しています。私のモデルは
class Category(models.Model):
category_id = models.AutoField(primary_key=True)
category_name = models.CharField("Category Name", max_length = 30)
category_created_date = models.DateField(auto_now = True, auto_now_add=False)
category_updated_date = models.DateField(auto_now = True, auto_now_add=False)
def __str__(self):
return self.category_name
serializer.py
class CategorySerializer(serializers.ModelSerializer) :
class Meta:
model = Category
fields = ['category_id', 'category_name']
def category_list(request):
if request.method == 'GET':
categories = Category.objects.all()
serializer = CategorySerializer(categories, many=True)
return Response(serializer.data)
URLでリクエストをヒットし、次の応答を返すと、正常に機能しています。
[
{
"category_id": 1,
"category_name": "ABC"
}
]
dB専用であるため、応答フィールド名を変更したいのですが、応答として開示したくありません。シリアライザークラスの名前を変更すると、フィールド一致エラーは発生しません。
また、以下のようなメッセージとステータスを持つ応答オブジェクトで、上記の応答のような他のパラメータをカスタマイズしたいと思います。
{
status : 200,
message : "Category List",
response : [
{
"id": 1,
"name": "ABC"
}
]
}
適切なガイドとフローが必要です。専門家がお手伝いします。
最初にフィールド名にcategory_
を使用することは冗長です。すでにこのフィールドをCategory
モデルに割り当てており、これを行うことで、このフィールドの「名前空間」を作成しているためです。
class Category(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField("Category Name", max_length = 30)
created_date = models.DateField(auto_now = True, auto_now_add=False)
updated_date = models.DateField(auto_now = True, auto_now_add=False)
def __str__(self):
return self.name
SecondIn Django id
AutoFieldは自動的に作成されます。なぜ明示的に設定する必要があるのですか?
そしてあなたの質問に答えるシリアライザーフィールドに source
パラメーターがあります。
class CategorySerializer(serializers.ModelSerializer):
renamed_id = serializers.IntegerField(source='category_id')
renamed_name = serializers.CharField(source='category_name')
class Meta:
model = Category
fields = ['renamed_id', 'renamed_name']
そして、あなたが手動であなたの応答を変えることができるより
from rest_framework import status
def category_list(request):
if request.method == 'GET':
categories = Category.objects.all()
serializer = CategorySerializer(categories, many=True)
response = {
'status': status.HTTP_200_OK,
'message' : "Category List",
'response' : serializer.data
}
return Response(response)
シリアライザーのto_representation関数をオーバーライドできます。次のコードを確認して、必要に応じてdata
辞書を更新できます。
class CategorySerializer(serializers.ModelSerializer) :
class Meta:
model = Category
fields = ['category_id', 'category_name']
def to_representation(self, instance):
data = super(CategorySerializer, self).to_representation(instance)
result_data={"status" : 200,"message" : "Category List"}
result_data["response"]=data
return result_data
json
でまとめることができます。これはあなたが望むようにレンダリングする方法です:
from Django.http import HttpResponse
import json
def category_list(request):
if request.method == 'GET':
categories = Category.objects.all()
serializer = CategorySerializer(categories, many=True)
response = {'code: 200, 'message': 'Category List', 'response': serializer.data}
return HttpResponse(json.dumps(response), mimetype='application/json')
これは、フィールドの名前を変更する方法です。
class CategorySerializer(serializers.ModelSerializer):
name = serializers.CharField(source='category_name')
class Meta:
model = Category
fields = ['category_id', 'name']
これは、異なる名前でシリアル化するための docs です。
Django 2.1.1で、ビューセットを使用している場合は、次のように.list()
アクションをオーバーライドすることで、応答の他の部分をカスタマイズできます。
from rest_framework import status
from Django.http import HttpResponse
import json
class CategoryViewset(viewsets.ReadOnlyModelViewSet):
categories = Category.objects.all()
def list(self, request):
if request.method == 'GET':
serializer = CategorySerializer(self.categories, many=True)
response = {
'status': status.HTTP_200_OK,
'message' : "Category List",
'response' : serializer.data,
}
return HttpResponse(json.dumps(response), content_type='application/json')