Django REST框架序列化模型组合

时间:2014-07-23 13:01:11

标签: python django django-rest-framework

我正在使用JavaScript客户端编写在线游戏,我使用Django REST framework作为后端。我为它写了一个任务系统。

我的任务对象是从django model QuestTemplate动态创建的,它存储Quest desription和titel(每个用户都相同的部分)等信息;另一个model QuestHistory我在其中提供了有关特定用户的任务状态的信息:因此它包含usercompleted等字段。它们还有一些嵌套对象:Tasks和Rewards,它们以与Quest对象类似的方式创建。

我添加了一个纯python类Quest,它结合了这些模型的所有字段,然后我为这个类编写了一个Serializer。缺点是我必须在QuestSerializer

中再次定义所有字段

我已经看到,对于ModelSerializer,您可以使用inner class Meta来指定模型和。是否还有一种方法可以使用普通的python类而不是模型(使用我的Quest类)。 http://www.django-rest-framework.org/api-guide/serializers#specifying-nested-serialization

或者:

是否可以在此内部类中指定多个模型,以便从我的model QuestTemplate和我model QuestHistory的其他字段中获取字段?

(我也不确定这种结构是否有意义并在此处询问:django models and OOP design

1 个答案:

答案 0 :(得分:1)

在ModelSerializer的Meta类中,据我所知,您只能指定一个Model。但是,有可能将自定义字段添加到序列化程序。在您的情况下,您可以尝试:

custom_field = serializers.SerializerMethodField('some_method_in_your_serializer')

您应该将此方法添加到序列化程序中,如下所示:

def some_method_in_your_serializer(self, obj):
    # here comes your logic to get fields from other models, probably some query
    return some_value # this is the value that comes into your custom_field

将custom_field添加到Meta类中的字段:

class Meta:
    fields = ('custom_field', 'all_other_fields_you_need')

查看有关SerializerMethodField的文档,以便更深入地了解。