Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为django模型发出特定JSON的更干净/可重用的方式_Python_Django_Json - Fatal编程技术网

Python 为django模型发出特定JSON的更干净/可重用的方式

Python 为django模型发出特定JSON的更干净/可重用的方式,python,django,json,Python,Django,Json,我正在重写应用程序的后端以使用Django,并且我希望尽可能保持前端不变。我需要与项目之间发送的JSON保持一致 在models.py中,我有: 在views.py中,以JSON形式获取所有资源数据: def get_resources(request): resources = [] for resource in Resource.objects.all(): resources.append({ "_id": resource._id

我正在重写应用程序的后端以使用Django,并且我希望尽可能保持前端不变。我需要与项目之间发送的JSON保持一致

在models.py中,我有:

在views.py中,以JSON形式获取所有资源数据:

def get_resources(request):
    resources = []
    for resource in Resource.objects.all():
        resources.append({
            "_id": resource._id,
            "name": resource.first,
            "bookingPercentage": resource.bookingPercentage                     
        })
    return HttpResponse(json.dumps(resources))
这正是我所需要的,但它似乎有点与Django和/或Python背道而驰。使用.all.values将不起作用,因为bookinPercentage是派生属性


另一个问题是,还有其他类似的模型需要以几乎相同的方式使用JSON表示。我将重写类似的代码,只是对模型的值使用不同的名称。总的来说,有没有更好的方法可以做到这一点,即更具pythonic/djangthonic/不需要手动创建JSON?

听起来您只是想用JSON序列化您的模型。您可以在core中使用Serialiser:

from django.core import serializers

data = serializers.serialize('json', Resource.objects.all(), fields=('name','_id', 'bookingPercentage'))
因此,只需传入模型类和要序列化到视图中的字段:

get_resources(request, model_cls, fields):

此处的文档

以下是我在这种情况下的做法:

def get_resources(request):
    resources = list(Resource.objects.all())
    for resource in resources:
        resource.booking = resource.bookingPercentage()                    

也就是说,我使用派生属性为每个实体创建一个新属性。它只是一个未存储在数据库中的本地属性,但可用于json.dumps调用。

在字段中包含_id和bookingPercentage不会将它们包含在json中,它们仍然包装在对象属性字段中,但我需要它们位于顶层。为什么要向下投票,只是因为我的建议不符合你的喜好?并不是说它不符合我的喜好,而是因为我描述的原因它实际上不起作用。似乎字段只能用于限制字段条目
def get_resources(request):
    resources = list(Resource.objects.all())
    for resource in resources:
        resource.booking = resource.bookingPercentage()