python - 如何自定义 Django 模型的 python 端?

标签 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):
    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()访问流

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

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

关于python - 如何自定义 Django 模型的 python 端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6975952/

相关文章:

php - 在移动到下一个项目之前等待 PHP 中的任务完成

django - 仅在 Django 中按日期字段排序

python - 将 python django 项目 1.3 升级到 1.5

python - Django 应用程序内存使用情况

python - 替代 requests.post 功能?

python - 如何使嵌套面板和 Sizer 在 wxpython 中工作

mysql - 如何设置从 5000 开始的自动递增

mysql - Ruby on Rails 对用户输入和 mySQL 提供建议

python - 方法作为字符串存储到运行的方法中

python - 使用 mechanize 提交没有控件名称的表单