如何定制Django模型的python端?

2024-04-19 01:10:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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

稍后,我想将所有流条目序列化为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
        }
    }, 
    ...

另外,我想在输出中获得streamnetwork的名称,而不是id。你知道吗

有没有Django方法可以自定义序列化输出的格式?你知道吗

谢谢你的回复


Tags: djangonamefrom模型importselfmodel序列化
3条回答

我使用django-piston作为我的restfulapi,并使用它的框架进行序列化,您可以配置要包含哪些字段、引用的对象,以及添加其他或重命名字段。你知道吗

Django pure的另一种机制是使用model\ to\ dict:

from django.forms.models import model_to_dict
results = []
for instance in query:
    d = model_to_dict(instance, fields=['field1', 'field2', ...])
    results.append(d)
string = serialize(format, results)

请记住,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.objects.all\已序列化()

另一种方法是将QuerySet子类化,这样它只返回您想要的信息,然后在QuerySet上使用serialize()方法,但我从未涉足过这一点,并假设它需要了解QuerySet如何在引擎盖下工作(它可能比我的解决方案效率略高,但由于关键是要序列化所有内容,并且您希望对每个条目进行外键查找以找到网络名称,因此我假设您不会处理大量数据)。你知道吗

编辑:关于您对Rob的解决方案的评论,请参阅documentationfor serialize()——您可以定义要序列化的字段,但我认为它不支持外键查找,您仍然可以获得QuerySet格式的字段(pk、model和fields)。你知道吗

相关问题 更多 >