问题描述
我在django-rest-framework序列化程序中遇到此问题,在其中我有一个choicefield,它从模型/表中获取列表。但是,当第一次迁移项目时,会引发异常。我现在使用try / except方法对其进行了管理,但想知道是否有更好的解决方案,因为我想使用来自模型查询的数据来使用更多选择字段。
宝贝,我现在有:
class FooSerializer(Serializer):
try:
bar = serializers.ChoiceField([foo.name for foo in Bar.objects.filter(active=True)],required=True)
except Exception as error:
handle_error(error)
bar = serializers.ChoiceField([])
编辑: 也尝试过这种方法:
from django.db.utils import OperationalError
try:
bar = serializers.ChoiceField([foo.name for foo in Bar.objects.filter(active=True)],required=True)
except OperationalError:
pass
解决方法
这里的问题是您的内联Python代码在迁移期间无法序列化,如此处记录的serializing values。
解决方法可能是在此处使用functools.partial或部分方法,如下所示:
from functools import partial
def get_choices(active=True):
return [foo.name for foo in Bar.objects.filter(active=active)]
# ...
bar = serializers.ChoiceField(partial(get_choices,True),required=True)
我没有测试过此代码,但之前在我自己的项目中成功使用了非常相似的解决方案。
,我在 MultipleChoiceField 上遇到了同样的问题。我发现solution
....
def get_field_choices():
try:
_obj= [(obj.id,obj.serial_number)for obj in City.objects.all()]
except:
_obj = list(tuple())
return _obj
city= serializers.MultipleChoiceField(choices=get_field_choices())
....