내 클라이언트가 json 배열로 POST를 보내고 요청한 데이터의 전체 세부 정보를 기다리고 있습니다. 단일 요청 및 단일 응답에는 문제가 없지만 오버 헤드를 최소화하려면 배열을 처리하고 싶습니다. 내 직렬의POST json 배열 및 json 배열로 응답 받기
내 models.py
class RoFile(models.Model):
user = models.ForeignKey('auth.User', null=True)
filename = models.CharField(max_length=120, null=True)
deleted = models.BooleanField(default=False)
info = models.CharField(max_length=120, null=True)
md5check = models.CharField(max_length=120, null=True)
하나의 시도 :
내 의견의 시도에class RoFileSerializer(serializers.ModelSerializer):
deleted = serializers.ReadOnlyField(required=False)
user = serializers.ReadOnlyField(required=False)
info = serializers.ReadOnlyField(required=False)
class Meta:
model = RoFile
fields = (
'filename', 'md5check', 'deleted', 'user', 'info',
)
def create(self, validated_data):
return RoFile(**validated_data)
:
@api_view(['POST'])
def rofile_detaillist(request, format=None):
data = JSONParser().parse(request)
serializer = RoFileSerializer(data=data, many=True)
if serializer.is_valid():
json_add = []
for x in serializer.validated_data:
try:
rofile = RoFile.objects.filter(md5check=x['md5check'])
except ObjectDoesNotExist:
continue
*invalid code here*
return Response(jsonarraywithallinfos)
else:
return Resonse(status=status.HTTP_400_BAD_REQUEST)
다른 뷰 시도 :
class RoFileDetailList(viewsets.ModelViewSet):
model = RoFile
serializer_class = RoFileSerializer(many=True)
def get_queryset(self):
return Rofile.objects.filter(md5check=self.request.data['md5check'])
,536,913,632 10
후 예 :
난 다시 응답으로 필요한{"filename": "filename1.exe", "md5check": "f8541061779b1efc5c30c4783edfb8f8"},
{"filename": "filename2.exe", "md5check": "16cdac5eb0ec829c2e2c199488681f6e"}
: 잘못된 코드 부분
{"filename": "filename1.exe", "md5check": "f8541061779b1efc5c30c4783edfb8f8", user: "testuser1", deleted: "True", info: ""},
{"filename": "filename2.exe", "md5check": "16cdac5eb0ec829c2e2c199488681f6e", user: "testuser1", deleted: "False", info: ""}
미안하지만, 나는 이미 너무 많이 시도했습니다, 그래서 그 부분을 삭제 (사고로). 감사합니다.
편집 : POST로 만들 필요가 없습니다
, 나는은 (는) 추가 데이터를 검색 (모델의 나머지) 할 필요가있다. 나는 항목을 만들고 싶지 않기 때문에 serializer에서 create 함수를 변경해야했습니다. db에서 md5check와 관련된 데이터 만 검색하려고합니다. @ zaphod100.10 내 실제 시리얼에
감사 :
class RoFileSerializer(serializers.ModelSerializer):
class Meta:
model = RoFile
fields = '__all__'
read_only_fields = ('deleted',)
def create(self, validated_data):
return RoFile(**validated_data)
내보기 :
class RoFileListDetailApi(generics.ListCreateAPIView):
serializer_class = RoFileSerializer
def get_queryset(self):
return RoFile.objects.filter(md5check=self.request.data['md5check'])
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, many=True)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_200_OK, headers=headers)
내 게시물 :
{"filename": "filename1.exe", "md5check": "f8541061779b1efc5c30c4783edfb8f8"},
{"filename": "filename2.exe", "md5check": "16cdac5eb0ec829c2e2c199488681f6e"}
내 실제 응답이 지금 목록입니다 만 DB의 실제 데이터가 아닌 POST 데이터 만 사용하십시오.
{"filename": "filename1.exe", "md5check": "f8541061779b1efc5c30c4783edfb8f8", deleted: false, info: null, user: null},
{"filename": "filename2.exe", "md5check": "16cdac5eb0ec829c2e2c199488681f6e", deleted: false, info: null, user: null}
은 다음과 같아야합니다
{"filename": "filename1.exe", "md5check": "f8541061779b1efc5c30c4783edfb8f8", deleted: true, info: "some info", user: "usertest1"},
{"filename": "filename2.exe", "md5check": "16cdac5eb0ec829c2e2c199488681f6e", deleted: false, info: "some info2", user: "usertest2"}
감사합니다. 이미 데이터베이스에 있기 때문에 작성하고 싶지 않습니다. 추가 데이터를 얻기 위해 쿼리를 작성하기 만하면됩니다. 내 편집을 참조하십시오. – bingobear
@bingobear 어제 답변을 업데이트했습니다. 그것이 효과가 있었나요? –