【发布时间】:2016-03-03 08:32:16
【问题描述】:
我从 Order 对象的实例开始,并尝试将它们转换为 JSON 格式,该格式将用于更新表。我是 Django 特定代码结构的新手。
我选择的方法是:
- 将数据库中的数据作为多个
Order实例加载 - 将
Order实例转换为中间Table对象(已给出格式) - 将
Table对象序列化为JSON
到目前为止,我已经走了很远,但我无法让整个应用程序运行,除了在 Python shell 中运行它。我已经有了模型和序列化程序。
有人可以提供帮助,如何一次标记所有 Order 实例并在一次 API 调用中将它们转换为 Table 以及这个简单示例中缺少的任何其他内容吗?
models.py:
# Order corresponds to Line in the Table
class Order(models.Model):
doc = models.CharField(max_length=200, blank=True, null=True)
order = models.CharField(max_length=200, blank=True, null=True)
nothing = models.CharField(max_length=200, blank=True, null=True)
def __str__(self):
return self.order
class Table(models.Model):
pass
class Column(models.Model):
data = models.CharField(max_length=200, blank=True, null=True)
table = models.ForeignKey(Table)
def __str__(self):
return self.data
class Line(models.Model):
doc = models.CharField(max_length=200, blank=True, null=True)
order = models.CharField(max_length=200, blank=True, null=True)
nothing = models.CharField(max_length=200, blank=True, null=True)
table = models.ForeignKey(Table)
def __str__(self):
return self.order
serializers.py:
class TableSerializer(serializers.ModelSerializer):
columns = ColumnSerializer(many=True)
lines = LineSerializer(many=True)
class Meta:
model = Table
fields = [
'columns',
'lines'
]
class ColumnSerializer(serializers.ModelSerializer):
class Meta:
model = Column
fields = [
'data'
]
class LineSerializer(serializers.ModelSerializer):
class Meta:
model = Line
fields = [
'doc',
'order',
'nothing'
]
对于这个关系数据:
doc order nothing
564251422 564210 5648
546546545 98745 4668
JSON 输出应该是:
{
"columns": [
{
"data": "doc"
},
{
"data": "order"
},
{
"data": "nothing"
}
],
"lines": [
{
"doc": "564251422",
"nothing": 0.0,
"order": "56421"
},
{
"doc": "546546545",
"nothing": 0.0,
"order": "98745"
}
]
}
Shell 命令:
import polls.models
polls.models.Order.objects.all() # outputs all orders
table = polls.models.Table()
polls.models.Column(data="doc",table=table)
polls.models.Column(data="order",table=table)
polls.models.Column(data="nothing",table=table)
polls.models.Line(doc="564251422",order="56421",nothing="0.0",table=table)
polls.models.Line(doc="546546545",order="98745",nothing="0.0",table=table)
views.py(更新):
bunch = OrderSerializer(Order.objects.all(), many=True)
headers = bunch.data[0].keys()
headers_prepared = map (lambda x: {'data': x} , headers)
ordered_all = ( ('columns', headers_prepared), ('lines', bunch.data) )
data = collections.OrderedDict(ordered_all)
data_json = JSONRenderer().render(data)
return JsonResponse(data_json, safe=False)
【问题讨论】:
-
我看到您正在使用我在这里给您的答案示例:django nesting serializers in each other。但是这部分工作(序列化和反序列化)吗?你从来没有谈论过
Order对象,你能告诉我们你到底想做什么(最终目标)? -
这是一个基本的 Web 应用程序,它应该从数据库中检索数据,然后将它们转换为对象以供内部处理(非常重要),客户端应该接收指定格式的 JSON 数据,这些数据将以表(也指定了格式)。这里使用
Order是因为它是一个业务对象,需要翻译成客户端可以显示的东西(jQuery DataTables框架)。
标签: json django python-3.x object django-models