序列化程序的to_representation可以在DRF 3中生成多个输出项吗?

时间:2015-09-01 05:26:39

标签: python django python-2.7 django-rest-framework

简而言之,是一个序列化器:

class ReleaseComponentContactSerializer(StrictSerializerMixin, serializers.ModelSerializer):

    component = serializers.SlugRelatedField(source='release_component', slug_field='name',
                                             queryset=ReleaseComponent.objects.all())
    role = serializers.SlugRelatedField(source='contact_role', slug_field='name',
                                    read_only=False, queryset=ContactRole.objects.all())
    contact = ContactField()

    def to_representation(self, instance):

    ...........................
        # I hope return one dict or multiple dict, for first instance it return dict1, for second one it return dict2, dict3
        return ..............

    class Meta:
        model = RoleContact
        fields = ('id', 'component', 'role', contact)

我希望结果类似于dict1,dict2,dict3,NOT dict1,[dict2,dict3]。可能吗?我认为这就是我想要的。

最初的问题是我有三个模型,

class ReleaseComponent(models.Model):

    .................
    global_component            = models.ForeignKey(GlobalComponent)

    name                        = models.CharField(max_length=100)
    contacts        = models.ManyToManyField(Contact,   through='contact.RoleContact', blank=True)

class RoleContact(models.Model):
    contact_role = models.ForeignKey(ContactRole, related_name='role_contacts',
                                     on_delete=models.PROTECT)
    contact      = models.ForeignKey(Contact, related_name='role_contacts',
                                     on_delete=models.PROTECT)
    global_component = models.ForeignKey('component.GlobalComponent', blank=True, null=True,
                                         related_name='role_contacts')
    release_component = models.ForeignKey('component.ReleaseComponent', blank=True, null=True,
                                          related_name='role_contacts')

class GlobalComponent(models.Model):
    """Record generic component"""
    .................................
    contacts        = models.ManyToManyField(Contact, through='contact.RoleContact', blank=True)

如果ReleaseComponent没有联系人,它将使用其GlobalComponent的联系人。因此,一个RoleContact对象可以连接到多个发布组件,因为一个RoleContact - >一个GlobalComponent - >多个ReleaseComponent。如果ReleaseComponent有联系人且此联系人不与GlobalComponent共享,则它必须是一个RoleContact - >一个ReleaseComponent。一般来说,使用pickching queryset,一个RoleContact - >一个或多个ReleaseComponent。

我希望输出格式一致。在输出中,每个项对应一个ReleaseComponent的一个RoleContact信息。即使对于多个ReleaseComponent对象的RoleContact对象也是如此。我可以在to_representation中生成多个dicts,但在最终输出中,这个多个dict将在列表中,如

[dict2, dict3, dict4]

是否可以在最终输出中将它们排除在列表之外?成为:

的一部分

dict1, dict2,dict3,dict4, dict5,........?

感谢。

1 个答案:

答案 0 :(得分:1)

您可以在调用serializer.data后根据您的要求修改序列化数据,在视图中执行此操作。

您需要执行以下操作:

serialized_data = my_serializer.data  # original serialized data
return_data = [] # final response which will be returned
for item in serialized_data:
    if isinstance(item, list): # check if a list inside serialized data
        return_data += item # add the elements of the list to 'return_data' list
    else:    
        return_data.append(item) # Otherwise just append the item to 'return_data' list

return_data包含最终所需的回复。