使用Django / Postgres获取一个计算字段,如果不存在另一个字段值,则该字段将获取一个字段值

时间:2018-11-03 09:56:45

标签: django postgresql django-queryset

我有一个Django模型:

Item(models.Model):

    url = models.URLField(blank=True, null=True)
    alt_url = models.URLField(blank=True, null=True)

我想在数据库中进行选择以获取一个新变量,如果url存在,则该变量将具有url的值,如果不存在alt url的值,则将具有

使用伪代码:

'SELECT url=(url if url exist else alt_url) from item'

1 个答案:

答案 0 :(得分:1)

如果用“不存在”来表示NULL,则可以使用Coalesce function [Django-doc]

from django.db.models.functions import Coalesce

Item.objects.annotate(
    merge_url=Coalesce('url', 'alt_url')
)

这里Item将具有一个额外的属性.merge_url,该属性包含url的值,如果不存在,则包含alt_url的值。

话虽如此,对于一个非常简单的情况,最好在模型中添加一个属性:

Item(models.Model):

    url = models.URLField(blank=True, null=True)
    alt_url = models.URLField(blank=True, null=True)

    @property
    def merge_url(self):
        return self.url or self.alt_url

或者如果您仅对这些值感兴趣,则可以这样写:

Item.objects.annotate(
    merge_url=Coalesce('url', 'alt_url')
).values_list('merge_url', flat=True)