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

时间:2019-08-10 14:48:50

标签: 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中创建一个方法,像这样:


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

目标是这样的: 如果模型中的field_3确实存在,我想获取它的值,否则,我想从Value()获取默认值。

问题在于,如果模型中的field_3不存在,它将通过异常而不是仅仅提供NULL值,这在逻辑上是正确的...

通过DB或ORM工具在数据库级别实现这种逻辑有什么办法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

Coalesce不会处理缺少的,它会处理不存在的值。

不过,您可以通过访问_meta选项来简单地检查模型,并查看是否存在这样的列,例如使用.get_field(..) [Django-doc]

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

您可以“参数化”列名,并运行几次(例如)以为model中所有缺少的列注入值。