我有一个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'
答案 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)