【问题标题】:How do I customize the python side of my Django models?如何自定义 Django 模型的 python 端?
【发布时间】:2011-10-22 00:02:43
【问题描述】:

我有一个定义一对多模型关系的 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 方法可以自定义序列化输出的格式?

感谢任何有用的回复

【问题讨论】:

    标签: python mysql django models


    【解决方案1】:

    请记住,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()来访问这个流

    另一种方法是对 QuerySet 进行子类化,因此它只返回您想要的信息,然后在查询集上使用 serialize() 方法,但我从未涉足过这一点,并假设它需要一些有关如何操作的知识QuerySets 在后台工作(它可能比我的解决方案更有效,但由于关键是要序列化所有内容,并且您想对每个条目进行外键查找以查找网络名称,我假设您没有使用巨大的数据量)。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我正在寻找一种 Django 方法来解决我的问题,抱歉。如果 Django 不支持自定义模型的序列化方式,我会接受它作为答案
      • 嗯,我认为添加很多应用程序来做事情是 Django 的方式:-) 请参阅我的第二个答案。
      【解决方案3】:

      另一个,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)
      

      【讨论】:

        猜你喜欢
        • 2012-07-06
        • 2011-04-24
        • 2020-03-24
        • 2016-01-09
        • 2021-07-14
        • 2017-06-22
        • 2014-01-31
        • 2015-10-17
        • 2012-03-17
        相关资源
        最近更新 更多