gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:45:51 29 4
gpt4 key购买 nike

我有一个定义一对多模型关系的 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com