将具有相关对象的模型对象序列化为JSON

时间:2015-06-09 10:16:19

标签: django django-serializer

我正在使用Person模型存储人员详细信息。

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)    
    birthdate = models.DateField()

我也有模型PersonLogs来存储人的活动日志。

class PersonLogs(models.Model):
    person = models.ForeignKey(Person)
    time = models.DateTimeField(auto_now_add=True)

我正在使用Django Serializer将Person对象作为响应返回JSON格式。

from django.core import serializers
data = serializers.serialize("json", Person.objects.all())

输出:

{
    "model": "store.person",
    "fields": {
        "first_name": "Douglas",
        "last_name": "Adams",
        "birth_date": "1952-03-11",
    }
}

现在我想将PersonLogs返回到响应JSON。

预期产出:

{
    "model": "store.person",
    "fields": {
        "first_name": "Douglas",
        "last_name": "Adams",
        "birth_date": "1952-03-11",
        "personlogs": [['2015-06-09 15:42:58.861540'], ['2014-06-09 15:42:58.861540'], [2013-06-09 15:42:58.861540]]
    }
}

我查看了官方文档,但我没有得到任何帮助。 link

2 个答案:

答案 0 :(得分:3)

您似乎希望使用反向Person关系序列化ForeignKey。 Django的序列化程序不支持这一点。例如,正如@DanielRoseman的评论所指出的那样,你必须使用Django REST Framework。

但如果您可以妥协,以下解决方案将有效。

class PersonManager(models.Manager):
    def get_by_natural_key(self, first_name, last_name, birthdate):
        return self.get(first_name=first_name, last_name=last_name, birthdate=birthdate)

class Person(models.Model):
   objects = PersonManager()

   # other fields
   ...

现在,您不必序列化Person,而是必须序列化PersonLogs,这将输出:{/ p>

{
    "pk": 1,
    "model": "models.PersonLogs",
    "fields": {
        "time": "2015-06-09 15:42:58.861540",
        "person": ["Douglas", "Adams", "1952-03-11"]
    }
}

答案 1 :(得分:1)

您可以使用序列化模板。

将相关名称指定给PersonLogs

class PersonLogs(models.Model):
    person = models.ForeignKey(Person,related_name='logs')
    time = models.DateTimeField(auto_now_add=True)

创建序列化模板

logs_template = {
    'fields': [':local'],
}
person_template = {
    'fields' :[':local',':related'],
    'related':{
         'logs':logs_template,
    }
}

使用以下功能对其进行序列化:

from preserialize.serialize import serialize
finaldata = serialize(data, **person_template)
相关问题