我有以下问题:
例如,我有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工具在数据库级别实现这种逻辑有什么办法吗?
谢谢
答案 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
中所有缺少的列注入值。