6

我有一个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]]
    }
}

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

4

2 回答 2

3

看来你想Person用反向ForeignKey关系序列化。Django 的序列化程序不支持。例如,正如@DanielRoseman在评论中指出的那样,您必须使用 Django REST 框架。

但是,如果您可以妥协,以下解决方案将起作用。

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,这将输出以下内容:

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

您可以使用序列化模板。

给相关名称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)
于 2017-09-05T12:31:21.783 回答