Используя Django / Postgres получить вычисляемое поле, которое получает значение поля, если существует, если не другое значение поля - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть модель 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 голосов
/ 03 ноября 2018

Если для «несуществующего» вы имеете в виду NULL, вы можете использовать функцию Coalesce [Django-doc] :

from django.db.models.functions import Coalesce

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

Здесь Item s будет иметь дополнительный атрибут .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)
...