问题描述
我有一个包含多个字段的数据库,但是我只想获取最近插入到数据库中的一个字段(“名称”)的值。
我在views.py中尝试了一些代码,但是它们都返回错误:
name=Record.objects.values_list('name', flat=True).latest('id')
name=Record.objects.values_list('name', flat=True).latest('name')
name=Record.objects.values_list('name', flat=True).order_by('-id')[:1]
name=Record.objects.values('name').latest('id')
错误:需要超过1个值才能解包
我该如何解决这个问题? 谢谢。
views.py代码供您参考。
class XXXView(ListView):
context_object_name = XXX'
template_name = 'XXX.html'
queryset = xxx.objects.all()
name=entry.objects.latest('id').name
if name is not None:
queryset=queryset.filter(name=name)
sales=xxx.objects.filter(queryset).aggregate(Sum('sales'))
def get_context_data(self, **kwargs):
context = super(XXXView, self).get_context_data(**kwargs)
context['bbb'] = entry.objects.order_by('-id')[:1]
return context
1楼
您应该在latest()
之后询问名称,即:
name=Record.objects.latest('id').name
values('name')
会丢弃除名称之外的所有内容,因此在该调用之后,您将不再找到最后一个ID。
2楼
尝试这个:
name = Record.objects.values_list('name', flat=True).last()
latest(field_name)
使用提供的date_name作为日期字段按日期返回表中的最新对象。
3楼
latest
和order_by
方法需要在Queryset
上运行。
values_list方法返回一个列表,所以这就是为什么会出现错误的原因。
此外,最新的返回一个对象,而不是一个Queryset
这样的切换这两种方法的顺序是不够的,因为values_list
也有一个运行Queryset
因此,要么只使用对象:
name=Record.objects.latest('id').name
或更有效地:
name=Record.objects.only('name').latest('id').name
只是一个注释。
以这种方式使用最新功能可能会产生误导。
使用最新的id
作为参数将为您提供数据库中id
最大的对象。
根据您的需求,最好添加一个带有auto_now_add / auto_now的DateTimeField
并将其用作最新查询的基础。
这将使您更清楚地了解“最新”在您的特定情况下的含义。
如果发现QuerySet文档非常好: :
而且,如果您想下次进行测试以自己解决问题,我真的建议您运行python manage.py shell
并导入模型以测试您的衬板。
您还应该研究一下测试,一旦情况变得更加复杂,它可以为您提供一个更好的故障排除界面: :