有很多关于如何序列化模型QuerySet的文档,但是如何将模型实例的字段序列化为JSON呢?
当前回答
ville = UneVille.objects.get(nom='lihlihlihlih')
....
blablablab
.......
return HttpResponse(simplejson.dumps(ville.__dict__))
我返回我实例的字典
所以它会返回类似{'field1':value,"field2":value,....}
其他回答
下面是我的解决方案,它允许您轻松地自定义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)
让这是一个农作物序列化器,做如下所示。对我有用,当然对你也有用。
首先导入序列化器
from django.core import serializers
然后你可以这样写
class CropVarietySerializer(serializers.Serializer):
crop_variety_info = serializers.serialize('json', [ obj, ])
或者你可以这样写
class CropVarietySerializer(serializers.Serializer):
crop_variety_info = serializers.JSONField()
然后在views.py中调用这个序列化器 详情请访问https://docs.djangoproject.com/en/4.1/topics/serialization/ 序列化器。JSONField(*args, **kwargs)和serializer .JSONField()是相同的。您也可以访问https://www.django-rest-framework.org/api-guide/fields/了解JSONField()的详细信息。
要序列化和反序列化,请使用以下命令:
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
如果你处理的是一个模型实例列表,你能做的最好的就是使用serializer .serialize(),它会非常适合你的需要。
但是,您将面临试图序列化单个对象而不是对象列表的问题。这样,为了摆脱不同的黑客,只需使用Django的model_to_dict(如果我没有弄错的话,serializer .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)
就是这样!:)
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),你就得到了你想要的东西。
推荐文章
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- Django REST框架:向ModelSerializer添加额外字段
- 如何在django上自动化createsuperuser ?
- 如何将Django QuerySet转换为列表?
- 如何直接从测试驱动程序调用自定义的Django manage.py命令?
- 在Python Django中运行单元测试时,如何禁用日志记录?
- Django CSRF检查Ajax POST请求失败
- 如何重命名一个模型字段使用南方?
- Django修复Admin复数
- 如何在Django上列出urlpatterns(端点)?
- Django自引用外键
- Django:“projects”vs“apps”
- 我如何在Django中过滤一个DateTimeField的日期?
- 如何在Django中序列化一个模型实例?
- Django更改默认的runserver端口