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,从而避免在序列化程序中执行此操作。