Django序列化程序只为父类对象返回JSON,并保留子对象不变?

2024-06-16 13:51:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这些型号:

class Projects(models.Model):
    projectName =models.CharField(max_length = 100,unique=True,db_index=True)
    projectManager = EmbeddedModelField('Users')

class Teams(models.Model):
    teamType = models.CharField(max_length =100)
    teamLeader = EmbeddedModelField('Users')
    teamProject = EmbeddedModelField('Projects')

class Users(models.Model):
    name = models.CharField(max_length = 100,unique=True)
    designation = models.CharField(max_length =100 )
    teams = ListField(EmbeddedModelField('Teams'))

我需要从我的视图中返回与用户和团队。我的视图.py有这个密码吗

^{pr2}$

这个输出JSON只用于project对象,而不为像这样的用户对象返回JSON

[{"pk": "4eb3b7d0e814520db4000000", "model": "RESTAPI.projects", "fields": {"projectName": "HELLO", "projectManager": "Users object"}}]

如何将User对象也转换成JSON?在


Tags: 对象jsontruemodelmodelslengthusersmax
2条回答

我也有同样的问题,这是我的案例:

Tl;dr: 您需要为您使用的每个嵌入式模型生成一个序列化程序,并将其设置为“父”序列化程序。这样,您的输出将序列化您的嵌入式模型。在

models.py

class Log(models.Model):
    status    = models.CharField(max_length=10, default='Sending')
    requested = models.DateTimeField(default=timezone.now)
    sent      = models.DateTimeField(null=True, default=None)
    log       = ListField(EmbeddedModelField('Log_Event'))

class Log_Message(models.Model):
    channel = models.ForeignKey(Channel)
    to      = models.CharField()
    message = models.CharField()

class Log_Event(models.Model):
    type    = models.CharField()
    message = models.CharField()
    date    = models.DateTimeField(default=timezone.now)

serializers.py

^{pr2}$

views.py

from models         import Log
from rest_framework import viewsets, filters
from serializers    import LogSerializer

class LogViewSet(viewsets.ModelViewSet):
    queryset         = Log.objects.all()
    serializer_class = LogSerializer
    filter_fields    = ('system', 'message', 'status', 'requested', 'sent', 'log')

JSON output

{
    "status": "Sent", 
    "requested": "2014-07-25T18:06:00.653", 
    "sent": "2014-07-25T18:06:03.707", 
    "log": [
        {
            "type": "starting...", 
            "message": "Trying to send...", 
            "date": "2014-07-25T18:06:00.659"
        }, 
        {
            "type": "success", 
            "message": "Mail SENT!", 
            "date": "2014-07-25T18:06:03.707"
        }
    ]
}

我前段时间遇到过这个问题,I created a snippet to help me out

def get_values(instance, go_into={}, exclude=(), extra=()):
    """
    Transforms a django model instance into an object that can be used for
    serialization. Also transforms datetimes into timestamps.

    @param instance(django.db.models.Model) - the model in question
    @param go_into - relations with other models that need expanding
    @param exclude - fields that will be ignored
    @param extra - additional functions/properties which are not fields

    Usage:
    get_values(MyModel.objects.get(pk=187),
               {'user': {'go_into': ('clan',),
                         'exclude': ('crest_blob',),
                         'extra': ('get_crest_path',)}},
               ('image'))

    """

所以你可以用这样的方法:

^{pr2}$

免责声明:我为自己的目的编写了脚本;它可能并不完美,可能需要进一步修改以满足您的需要。

相关问题 更多 >