Django:如果模型尚不存在,Serializer会在迁移中引发异常

问题描述

我在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())

    ....

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...