如何在单个请求中为ngoptions生成正确的数据结构

时间:2014-01-17 18:07:39

标签: angularjs django-rest-framework

我正在尝试返回一个Angular屏幕的数据结构,有几个下拉列表。

我不想发出多个请求来获取每个select的选项,所以我希望在Django中创建一个包含每个select的所有选项的单个嵌套数据结构(只有一小部分)

Angular想要使用select和ngoptions指令:

{'booking_name': 'acme',
'current_sales_person': 2,
'sales_people_options': [
    {id: 1, name: 'rod'},
    {id: 2, name: 'jane'},
    {id: 3, name: 'freddy'}
],
... lots more fields here ... 

}

sales_people_options将填充下拉列表的选项,current_sales_person表示最初选择了哪个销售人员。

如何让Django Rest Framework在ModelSerializer的单个请求中返回?

我可以直接通过JSONRenderer创建JSON,但我有很多其他字段,所以我很想使用ModelSerializer。

唯一的方法似乎是将一个名为sales_people_options的方法添加到我的模型中。

但是 - 我已经生成了几个这样的字段,为某些特定的序列化程序只需要添加模型方法似乎是非常错误的。

编辑 - 我想我可能需要继承serializer.Field并覆盖一个方法(可能是field_to_native)。

2 个答案:

答案 0 :(得分:0)

这只是一个json对象。 Django休息框架能够返回json字符串,然后您可以JSON.stringify返回的字符串将其转换为角度预期的对象。

{'booking_name': 'acme',
'current_sales_person': 2,
'sales_people_options': [
    {id: 1, name: 'rod'},
    {id: 2, name: 'jane'},
    {id: 3, name: 'freddy'}

结帐Django JSON渲染器; http://www.django-rest-framework.org/api-guide/renderers

答案 1 :(得分:0)

这可能是一种奇怪的方式,但它起作用了:

class BookingSerializer(serializers.ModelSerializer):

    class UserOptionsField(serializers.Field):
        def field_to_native(self, obj, field_name):
            return User.objects.all().values('id', 'username')

    sales_people_options = UserOptionsField()

    class Meta:
        model = Booking
        fields = (
            'id', 'booking_no', 'current_salesperson', 'sales_people_options',
        )

编辑:这是一个通用的解决方案:

class ModelOptionsField(serializers.Field):

    def __init__(self, source=None, label=None, help_text=None, queryset=None, fields=None):
        self.queryset = queryset
        self.fields = fields
        super(ModelOptionsField, self).__init__(source, label, help_text)

    def field_to_native(self, obj, field_name):
        return self.queryset.values(*self.fields)

你这样使用:

class MySerializer(serializers.ModelSerializer):

    my_options_list = ModelOptionsField(queryset=User.objects.all(), fields=('id', 'username'))