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

Pra*_*aur 6 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()
Run Code Online (Sandbox Code Playgroud)

我也有模特PersonLogs来存储人的活动日志.

class PersonLogs(models.Model):
    person = models.ForeignKey(Person)
    time = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

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

from django.core import serializers
data = serializers.serialize("json", Person.objects.all())
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "model": "store.person",
    "fields": {
        "first_name": "Douglas",
        "last_name": "Adams",
        "birth_date": "1952-03-11",
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想回到PersonLogsJSON回复.

预期产出:

{
    "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]]
    }
}
Run Code Online (Sandbox Code Playgroud)

我查看了官方文档,但我没有得到任何帮助.链接

xyr*_*res 3

看来你想Person以反向ForeignKey关系进行序列化。Django 的序列化器不支持这一点。您必须使用 Django REST Framework,例如,正如@DanielRoseman的评论中指出的那样。

但如果你能妥协,下面的解决方案就会起作用。

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
   ...
Run Code Online (Sandbox Code Playgroud)

现在,您不必进行序列化Person,而是必须序列化PersonLogs,这将输出以下内容:

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