모델 QuerySet을 직렬화하는 방법에 대한 많은 문서가 있지만 모델 인스턴스의 필드를 JSON으로 직렬화하는 방법은 무엇입니까?
모델 QuerySet을 직렬화하는 방법에 대한 많은 문서가 있지만 모델 인스턴스의 필드를 JSON으로 직렬화하는 방법은 무엇입니까?
답변:
목록을 사용하여 필요한 객체를 쉽게 래핑 할 수 있으며 장고 시리얼 라이저가 올바르게 직렬화하는 데 필요한 모든 것입니다.
from django.core import serializers
# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])
[0]
@DavorLucic이 제안한 것처럼 마지막 줄의 끝에서 원하지 않습니까? 그리고 목록 리터럴에서 쉼표를 사용할 필요가 없습니다 (PEP8의 사랑을 위해).
모델 인스턴스 목록을 다루는 가장 좋은 serializers.serialize()
방법은를 사용 하는 것입니다. 필요에 완벽하게 맞습니다.
그러나 개체가 아닌 단일 개체 를 직렬화하려고 할 때 문제가 발생 list
합니다. 이렇게하면 다른 핵을 제거하기 위해 Django를 사용하십시오 model_to_dict
(실수하지 않은 경우 serializers.serialize()
의존합니다).
from django.forms.models import model_to_dict
# assuming obj is your model instance
dict_obj = model_to_dict( obj )
이제 json.dumps
json으로 직렬화 하려면 한 번만 호출하면됩니다.
import json
serialized = json.dumps(dict_obj)
그게 다야! :)
datetime
필드 와 함께 실패 합니다. json.loads(serialize('json', [obj]))[0]
serializer가있는 동안 이 방법으로 해결django.core.serializers.serialize
배열 랩퍼를 피하려면 응답을 리턴하기 전에 제거하십시오.
import json
from django.core import serializers
def getObject(request, id):
obj = MyModel.objects.get(pk=id)
data = serializers.serialize('json', [obj,])
struct = json.loads(data)
data = json.dumps(struct[0])
return HttpResponse(data, mimetype='application/json')
주제에 대한이 흥미로운 게시물을 발견했습니다.
http://timsaylor.com/convert-django-model-instances-to-dictionaries
django.forms.models.model_to_dict를 사용하는데 이는 작업을위한 완벽한 도구처럼 보입니다.
이것에 대한 좋은 대답이 있으며 언급되지 않은 것에 놀랐습니다. 몇 줄로 날짜, 모델 및 기타 모든 것을 처리 할 수 있습니다.
모델을 처리 할 수있는 사용자 지정 인코더를 만듭니다.
from django.forms import model_to_dict
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import Model
class ExtendedEncoder(DjangoJSONEncoder):
def default(self, o):
if isinstance(o, Model):
return model_to_dict(o)
return super().default(o)
이제 json.dumps를 사용할 때 사용하십시오.
json.dumps(data, cls=ExtendedEncoder)
이제 모델, 날짜 및 모든 항목을 직렬화 할 수 있으며 배열 또는 직렬화 및 직렬화하지 않아도됩니다. 당신이 가진 것은 모두 사용자 정의 default
메소드에 추가 할 수 있습니다 .
Django의 네이티브 JsonResponse를 다음과 같이 사용할 수도 있습니다.
from django.http import JsonResponse
JsonResponse(data, encoder=ExtendedEncoder)
``
json.dumps
와 json.dump
방법 모두에 사용할 수 있습니다 . 이 방법으로 json으로 변환하기 전에 사용자 정의 객체를 사용하거나 다른 메소드 호출을 추가하므로 애플리케이션의 워크 플로우를 변경할 필요가 없습니다. 엔코더에 변환 코드를 추가하기 만하면됩니다.
당신이 요구하는 것은 상호 운용성을 위해 Django 모델 인스턴스의 데이터 구조를 직렬화하는 것과 관련이 있습니다. 다른 포스터는 정확합니다 .Django의 api를 통해 데이터베이스를 쿼리 할 수있는 파이썬 응용 프로그램에서 직렬화 된 양식을 사용하려면 하나의 객체로 쿼리 세트를 직렬화하고 싶습니다. 반면에 데이터베이스를 건드 리거나 장고를 사용하지 않고 모델 인스턴스를 다른 곳에 다시 팽창시키는 방법이 필요한 경우 약간의 작업이 필요합니다.
내가하는 일은 다음과 같습니다.
먼저 demjson
변환에 사용 합니다. 내가 처음 찾은 것이었지만 최고가 아닐 수도 있습니다. 구현은 해당 기능 중 하나에 의존하지만 다른 변환기와 비슷한 방법이 있어야합니다.
둘째, json_equivalent
직렬화가 필요한 모든 모델에 메소드를 구현하십시오 . 이것은 마법의 방법 demjson
이지만, 어떤 구현을 선택하든 생각하고 싶을 것입니다. 아이디어는 직접 변환 할 수있는 객체 json
(예 : 배열 또는 사전) 를 반환한다는 것 입니다. 실제로 자동으로 수행하려면 다음을 수행하십시오.
def json_equivalent(self):
dictionary = {}
for field in self._meta.get_all_field_names()
dictionary[field] = self.__getattribute__(field)
return dictionary
완전히 평평한 데이터 구조를 갖지 않는 한 ( ForeignKeys
데이터베이스의 숫자와 문자열 등) 가 아니면 도움이되지 않습니다 . 그렇지 않으면이 방법을 구현하는 올바른 방법에 대해 진지하게 생각해야합니다.
셋째, 전화 demjson.JSON.encode(instance)
하면 원하는 것을 가질 수 있습니다.
모델에서 단일 객체를 직렬화하는 방법을 묻고 쿼리 세트에서 객체를 하나만 얻는다는 것을 알고 있다면 (예 : objects.get 사용) 다음과 같은 것을 사용하십시오.
import django.core.serializers
import django.http
import models
def jsonExample(request,poll_id):
s = django.core.serializers.serialize('json',[models.Poll.objects.get(id=poll_id)])
# s is a string with [] around it, so strip them off
o=s.strip("[]")
return django.http.HttpResponse(o, mimetype="application/json")
어떤 형태의 것을 얻을 수 있습니다 :
{"pk": 1, "model": "polls.poll", "fields": {"pub_date": "2013-06-27T02:29:38.284Z", "question": "What's up?"}}
모델에 직렬화 방법을 추가하여이 문제를 해결했습니다.
def toJSON(self):
import simplejson
return simplejson.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))
한 줄짜리를 싫어하는 사람들에 대한 자세한 내용은 다음과 같습니다.
def toJSON(self):
fields = []
for field in self._meta.fields:
fields.append(field.name)
d = {}
for attr in fields:
d[attr] = getattr(self, attr)
import simplejson
return simplejson.dumps(d)
_meta.fields
인스턴스와 모델 자체에서 액세스 할 수있는 정렬 된 모델 필드 목록입니다.
여기에 내 솔루션이 있습니다.이 솔루션을 사용하면 JSON을 쉽게 사용자 정의하고 관련 레코드를 구성 할 수 있습니다
먼저 모델에서 메소드를 구현하십시오. 나는 전화 json
하지만 당신은 당신이 원하는대로 호출 할 수 있습니다, 예 :
class Car(Model):
...
def json(self):
return {
'manufacturer': self.manufacturer.name,
'model': self.model,
'colors': [color.json for color in self.colors.all()],
}
그런 다음보기에서 :
data = [car.json for car in Car.objects.all()]
return HttpResponse(json.dumps(data), content_type='application/json; charset=UTF-8', status=status)
car.json()
사용 목록, 문제를 해결할 것입니다
1 단계:
result=YOUR_MODELE_NAME.objects.values('PROP1','PROP2').all();
2 단계:
result=list(result) #after getting data from model convert result to list
3 단계 :
return HttpResponse(json.dumps(result), content_type = "application/json")
직렬화 및 직렬화 해제하려면 다음을 사용하십시오.
from django.core import serializers
serial = serializers.serialize("json", [obj])
...
# .next() pulls the first object out of the generator
# .object retrieves django object the object from the DeserializedObject
obj = next(serializers.deserialize("json", serial)).object
.values()
모델 인스턴스를 JSON으로 변환하는 데 필요한 것입니다.
.values () 문서 : https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
라는 모델과 사용 예제 프로젝트 .
참고 : Django Rest Framework를 사용하고 있습니다.
@csrf_exempt
@api_view(["GET"])
def get_project(request):
id = request.query_params['id']
data = Project.objects.filter(id=id).values()
if len(data) == 0:
return JsonResponse(status=404, data={'message': 'Project with id {} not found.'.format(id)})
return JsonResponse(data[0])
유효한 ID의 결과 :
{
"id": 47,
"title": "Project Name",
"description": "",
"created_at": "2020-01-21T18:13:49.693Z",
}
python
형식 과 함께 사용하십시오 .from django.core import serializers
qs = SomeModel.objects.all()
serialized_obj = serializers.serialize('python', qs)
json
과 의 차이점은 무엇입니까 python
?json
으로 포맷 한 결과를 반환 str
하는 반면 python
에 그 결과를 리턴하거나 list
또는OrderedDict
OrderedDict
없는,dict
ville = UneVille.objects.get(nom='lihlihlihlih')
....
blablablab
.......
return HttpResponse(simplejson.dumps(ville.__dict__))
나는 나의 인스턴스를 받아 들인다
{ 'field1': value, "field2": value, ....}와 같은 것을 반환합니다.
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
이 모든 대답은 내가 프레임 워크에서 기대할 수있는 것, 가장 간단한 방법과 비교하여 약간 해킹 적이었습니다.
rep = YourSerializerClass().to_representation(your_instance)
json.dumps(rep)
이것은 사용자가 정의한 필드와 연관 등을 고려하여 Serializer를 직접 사용합니다.
django.core
이를 수행 할 수는 없습니다 . 쿼리 세트를 직렬화하지 않는 특별한 이유가 있습니까?