Django 在不存在的值上注释返回null,我想将其转换为空字符串

Django 在不存在的值上注释返回null,我想将其转换为空字符串,django,string,django-rest-framework,null,annotate,Django,String,Django Rest Framework,Null,Annotate,我有两种型号,客户和采购。我想退回客户从中购买的最后一家商店,并在此上订购 我可以使用以下模型,查询/子查询,成功显示此列表,显示客户购买的最后一家店铺,并能够根据店铺名称进行订购 # models class Customer(models.Model): name = models.CharField(max_length=30) class Purchase(models.Model): store = models.CharField(max_length=30)

我有两种型号,客户和采购。我想退回客户从中购买的最后一家商店,并在此上订购

我可以使用以下模型,查询/子查询,成功显示此列表,显示客户购买的最后一家店铺,并能够根据店铺名称进行订购

# models
class Customer(models.Model):

    name = models.CharField(max_length=30)

class Purchase(models.Model):

    store = models.CharField(max_length=30)
    amount = models.DecimalField(decimal_places=2,max_digits=6)
    customerID = models.ForeignKey(Customer, on_delete=models.CASCADE, 
                                   related_name='purchases')
    order_date = models.DateField()

#viewset

#subquery
purchase_qs = Purchase.objects.filter(customerID=OuterRef("pk")).order_by("-order_date")

queryset = Customer.objects.all().annotate(last_purchase=Subquery(purchase_qs.values('store')[:1]))

ordering_fields = ['last_purchase']
我目前为零购买的客户提供的输出是

“上次购买”:空

我想要


“上次购买”:“

ForeignKey
字段自动将
\u id
附加到模型字段的名称中,因此您需要使用
customerId\u id
引用
ForeignKey
。很明显,这不是您想要的,因此我建议将字段重命名为
customer
,这也是您的查询为空的原因

话虽如此,您实际上并不需要
子查询
OuterRef
。相反,您可以使用
客户
模型的反向关系,以及
最大值

from django.db.models import Max

Customer.objects.select_related('Purchase').annotate(
    last_purchase = Max('purchases__order_date')
)
最后,默认情况下,
null
键为False,因此无需说
null=False
,而且
blank=True
null=False
没有意义。有关
null
blank
之间的区别的详细说明,请参阅

更新 该功能似乎非常适合此场景:

from django.db.models import Max, Coalesce, Value

Customer.objects.select_related('Purchase').annotate(
    last_purchase = Coalesce(Max('purchases__order_date', Value(''))
)

是的,你的例子很有用,所以没有必要再加一个子句。我仍然存在未购买商品的客户返回null的问题。我曾使用序列化程序“to_representation”方法将null更改为空字符串,但我希望在值到达序列化程序之前将其作为空字符串。我想我在注释上寻找一个条件语句,比如Case When,但我无法让它工作。合并工作并返回空字符串而不是null,从而避免在序列化程序中执行此操作。