Django Serializer возвращает JSON только для объектов родительского класса и оставляет дочерние объекты одинаковыми? - PullRequest
3 голосов
/ 05 ноября 2011

У меня есть эти модели:

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'))

Мне нужно вернуть JSON из моего представления для всех объектов Projects, которые в дальнейшем связаны с пользователями и командами. Мой views.py имеет этот код

from django.core import serializers

data = serializers.serialize('json', Projects.objects.all())

Это выводит JSON только для объекта проекта и не возвращает JSON для объекта USer, подобного этому

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

Как также преобразовать объект User в JSON?

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Я столкнулся с этой проблемой некоторое время назад, и Я создал фрагмент, чтобы помочь мне :

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'))

    """

Чтобы вы могли использовать что-то вроде этого:

simplejson.dumps(get_values(Projects.objects.all(),
    go_into={'projectManager': {'go_into': 'teams'}}))

отказ от ответственности: я создал сценарий для своих собственных целей;оно может быть не идеальным, может потребоваться дальнейшая модификация в соответствии с вашими потребностями.

0 голосов
/ 30 июля 2014

У меня была такая же проблема, вот мой случай:

Tl; др: Вам необходимо создать сериализатор для каждой используемой вами встроенной модели и установить его в «отцовский» сериализатор. Таким образом, ваш вывод будет сериализовать вашу встроенную модель.

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

from rest_framework import serializers
from models         import Log, Log_Event, Log_Message

class LogMessageSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model  = Log_Message
        fields = ('channel', 'to', 'message')

class LogEventSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model  = Log_Event
        fields = ('type', 'message', 'date')


class LogSerializer(serializers.HyperlinkedModelSerializer):
    message = LogMessageSerializer()
    log     = LogEventSerializer()

    class Meta:
        model  = Log
        fields = ('status', 'requested', 'sent', 'log')

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"
        }
    ]
}
...