1

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

models.py我有:

class Resource(models.Model):
    # Name chosen for consistency with old app
    _id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)

    @property
    def bookingPercentage(self):
        from bookings.models import Booking
        return Booking.objects.filter(resource=self)
            .aggregate(models.Sum("percent"))["percent__sum"]

并以views.pyJSON 格式获取所有资源数据:

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/djangothonic/不需要手动创建 JSON?

4

2 回答 2

0

这是我在这种情况下所做的:

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

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

于 2013-08-23T20:22:33.133 回答
-1

听起来您只想用 JSON 对模型进行序列化。您可以在核心中使用序列化程序:

from django.core import serializers

data = serializers.serialize('json', Resource.objects.all(), fields=('name','_id', 'bookingPercentage'))

因此,只需传入您的 Model 类,以及您想要序列化到视图中的字段:

get_resources(request, model_cls, fields):

此处的文档https://docs.djangoproject.com/en/dev/topics/serialization/#id2

于 2013-08-23T17:24:04.343 回答