我正在尝试返回一个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)。
答案 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'))