有很多关于如何序列化模型QuerySet的文档,但是如何将模型实例的字段序列化为JSON呢?
当前回答
似乎你不能序列化实例,你必须序列化一个对象的QuerySet。
from django.core import serializers
from models import *
def getUser(request):
return HttpResponse(json(Users.objects.filter(id=88)))
我运行了django的svn释放,所以这可能不是在早期版本。
其他回答
It sounds like what you're asking about involves serializing the data structure of a Django model instance for interoperability. The other posters are correct: if you wanted the serialized form to be used with a python application that can query the database via Django's api, then you would wan to serialize a queryset with one object. If, on the other hand, what you need is a way to re-inflate the model instance somewhere else without touching the database or without using Django, then you have a little bit of work to do.
我是这么做的:
首先,我使用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
这对你没有帮助,除非你有一个完全扁平的数据结构(没有foreignkey,数据库中只有数字和字符串等)。否则,您应该认真考虑实现此方法的正确方法。
第三,调用demjson.JSON.encode(instance),你就得到了你想要的东西。
使用列表,它将解决问题
步骤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")
如果你想将单个模型对象作为json响应返回给客户端,你可以做这个简单的解决方案:
from django.forms.models import model_to_dict
from django.http import JsonResponse
movie = Movie.objects.get(pk=1)
return JsonResponse(model_to_dict(movie))
这个问题有一个很好的答案,我很惊讶它没有被提及。只需几行代码,您就可以处理日期、模型和其他所有内容。
制作一个可以处理模型的自定义编码器:
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)
现在模型,日期和所有东西都可以序列化它不需要在数组中或序列化或非序列化。任何自定义的东西都可以添加到默认方法中。
你甚至可以这样使用Django的原生JsonResponse:
from django.http import JsonResponse
JsonResponse(data, encoder=ExtendedEncoder)
.values()是我需要将模型实例转换为JSON。
.values()文档:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
名为Project的模型的示例使用。
注意:我使用的是Django Rest Framework
from django.http import JsonResponse
@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",
}
推荐文章
- 如何在django应用程序中显示favicon ?
- 如何在Django中设置时区
- django导入错误-没有core.management模块
- 如何从外部访问本地Django web服务器
- 在Django模型中存储电话号码的最佳方法是什么?
- 如何禁用django-rest-framework的管理风格的可浏览界面?
- 如何获取请求。Django-Rest-Framework序列化器中的用户?
- 如何在Django模板中获得我的网站的域名?
- 在django Forms中定义css类
- 我应该在.gitignore文件中添加Django迁移文件吗?
- SQLAlchemy是否有与Django的get_or_create等价的函数?
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- Django REST框架:向ModelSerializer添加额外字段
- 如何在django上自动化createsuperuser ?
- 如何将Django QuerySet转换为列表?