如何定制Django模型的python端?

如何定制Django模型的python端?,python,mysql,django,models,Python,Mysql,Django,Models,我有一个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)

我有一个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
from django.core.serializers import serialize
string = serialize(format, Stream.objects.all())
[
    {
        "pk" : 1,
        "model" : "website.stream",
        "fields" : 
        {
            "network" : 2,
            "score" : 53,
            "name" : "DangerousDan1",
            "custom_url" : null
        }
    }, 
    ...
稍后,我想将所有流条目序列化为json。我是这样做的:

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
from django.core.serializers import serialize
string = serialize(format, Stream.objects.all())
[
    {
        "pk" : 1,
        "model" : "website.stream",
        "fields" : 
        {
            "network" : 2,
            "score" : 53,
            "name" : "DangerousDan1",
            "custom_url" : null
        }
    }, 
    ...
预期结果将是数据库中一行的简单序列化json版本。相反,输出如下所示:

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
from django.core.serializers import serialize
string = serialize(format, Stream.objects.all())
[
    {
        "pk" : 1,
        "model" : "website.stream",
        "fields" : 
        {
            "network" : 2,
            "score" : 53,
            "name" : "DangerousDan1",
            "custom_url" : null
        }
    }, 
    ...
此外,我希望在输出中获得streamnetwork的名称,而不是
id

那么,有没有Django方法可以自定义序列化输出的格式


感谢所有有用的回复

我使用restful API并使用其框架进行序列化,您可以配置要包含的字段、引用对象,以及添加其他或重命名字段。

请记住,查询集不仅仅是一个简单的数据库查询,因此“预期结果”应该是它包含了额外的信息。做你想做的事情的一个简单方法(我想说这是Django方法)是定义一个只返回你想要的东西的函数。比如:

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\u serialized()访问流

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


编辑:关于您对Rob的解决方案的评论,请参阅for serialize()-您可以定义要序列化的字段,但我认为它不支持外键查找,并且您仍然可以使用QuerySet格式(pk、模型和字段)。

另一种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)

我正在寻找一种Django方法来解决我的问题,对不起。如果Django不支持定制模型序列化的方式,我会接受这个答案。嗯,我认为添加大量应用程序来完成这些事情是Django方法:-)请参阅我的第二个答案。