Django rest framework 如果字段不存在,则获取字段值;如果不存在,则获取默认值,DRF

Django rest framework 如果字段不存在,则获取字段值;如果不存在,则获取默认值,DRF,django-rest-framework,Django Rest Framework,我有一个问题: 例如,我有3个几乎相似的型号: Model_A(models.Model) field_1 = …. field_2 = …. field_3 = …. Model_B(models.Model) field_1 = …. field_2 = …. field_3 = …. Model_C(models.Model) field_1 = …. field_2 = …. # no field 3 here 我想在serializers.py中创建一个方法,在其中我可以执行

我有一个问题:

例如,我有3个几乎相似的型号:

Model_A(models.Model)
field_1 = ….
field_2 = ….
field_3 = ….

Model_B(models.Model)
field_1 = ….
field_2 = ….
field_3 = ….


Model_C(models.Model)
field_1 = ….
field_2 = ….
# no field 3 here

我想在serializers.py中创建一个方法,在其中我可以执行以下操作:


def funk(self, model)
# model is Model_A, B or C

    model.objects.annotate(
    result= Coalesce( F(“field_3), Value(value=1,output_field=IntegerField())
    ).etc_etc_etc…

    return something here
目标是这样的: 如果模型中的字段_3确实存在,我想获取它的值,如果不存在,我想从
value()
获取默认值

问题是,如果模型中不存在
字段3
,它将通过异常而不是只提供逻辑正确的
NULL

有没有办法通过DB或ORM仪器在DB级别实现这种逻辑


谢谢

合并不会处理缺少的列,而是处理不存在的值

但是,您可以通过访问
\u meta
选项检查模型,并查看是否存在此类列,例如:

来自django.core.exceptions导入字段doesnotexist
从django.db.models导入值,IntegerField
def funk(自我,型号):
尝试:
模型._meta.get_字段('field_3'))
除FieldDoesNotExist外:
返回model.objects.annotate(
字段\u 3=值(1,输出\u字段=整数字段()
)
其他:
返回model.objects.all()
您可以“参数化”列名,并运行它(例如多次),为
模型中所有缺少的列注入值

from django.core.exceptions import FieldDoesNotExist
from django.db.models import Value, IntegerField

def funk(self, model):
    try:
        model._meta.get_field('field_3')
    except FieldDoesNotExist:
        return model.objects.annotate(
            field_3=Value(1, output_field=IntegerField())
        )
    else:
        return model.objects.all()