我有一个定义一对多模型关系的 Django 应用程序。模型如下所示:
from django.db import models
# Create your models here.
class StreamNetwork(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Stream(models.Model):
name = models.CharField(max_length=50)
custom_url = models.CharField(max_length=100, null=True)
network = models.ForeignKey(StreamNetwork)
score = models.SmallIntegerField()
def __unicode__(self):
return self.name
稍后我想将所有 Stream 条目序列化为 json。我这样做是这样的:
from django.core.serializers import serialize
string = serialize(format, Stream.objects.all())
预期结果将是数据库中行的简单序列化 json 版本。相反,输出如下所示:
[
{
"pk" : 1,
"model" : "website.stream",
"fields" :
{
"network" : 2,
"score" : 53,
"name" : "DangerousDan1",
"custom_url" : null
}
},
...
此外,我想在输出中获取流网络的名称,而不是 id
。
那么有没有一种 Django 方法可以让我自定义序列化输出的格式?
感谢您的有用回复
最佳答案
请记住,QuerySet 不仅仅是一个简单的数据库查询,因此“预期结果”应该是它包含附加信息。做你想做的事情的一种简单方法(我想说这是 Django 方式)是定义 model manager只返回您想要的内容。类似于:
import simplejson
class StreamManager(models.Manager):
def all_serialized(self):
qset = super(StreamManager, self).get_query_set()
return simplejson.dumps(
[{ 'id':item.id,
'name':item.name,
'network':item.network.name,
'score':item.score,
'custom_url':item.custom_url,}
for item in qset])
然后将objects = StreamManger()
放入您的Stream类中,您可以通过Stream.objects.all_serialized()访问流
编辑:关于您对 Rob 解决方案的评论,请参阅 documentation对于serialize() - 您可以定义要序列化的字段,但我认为它不支持外键查找,并且您仍然会以QuerySet格式(pk、model和fields)获得它。
关于python - 如何自定义 Django 模型的 python 端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6975952/