当我从数据库中选择不同的值时遇到问题。
这是我的模型:
class Shift(models.Model):
shiftid = models.CharField(max_length=15)
shiftdesc = models.CharField(blank = False, null= False, max_length=20)
dayname = models.CharField(blank = False, null= False, max_length=20)
class Meta:
unique_together = ('shiftid','dayname')
这是生成的数据结构:
shiftid shiftdesc dayname
shift1 desc1 1
shift1 desc2 1
shift1 desc1 1
我希望它是这样的:
shiftid shiftdesc dayname
shift1 desc1 1
shift1 desc2 1
我正在尝试选择这样的记录:
@action(methods=['get'], detail=False)
def shiftsum(self, request):
newest = self.get_queryset().order_by('shiftid','dayname').values('shiftid','dayname').distinct()
serializer = self.get_serializer_class()(newest)
return Response(serializer.data)
当我尝试这样做时,我总是收到此错误:
QuerySet object has no attribute 'shiftid'
另外,我想知道如何选择不同的值?我是 Django 新手,感谢每一个帮助。
最佳答案
默认情况下,序列化程序不处理对象列表。您需要传递 many=True
来告诉它处理每个项目并输出一个列表 ( rest framework docs )。
self.get_serializer_class()(newest, many=True)
这将为您提供一个日期列表,如您所期望的:
[
{ "shiftid": "shift1", "dayname": "1" }
]
独特
你的独特性很好。一个不同的查询示例与您的查询类似:
User.objects.values('field').order_by('field').distinct()
最终查询
最终查询的问题是您只选择了所需的 3 个字段中的 2 个,不包括 shiftdesc
。
实际上并没有一种合乎逻辑的方法来获取该值,因为根据定义,您以 N 开头并以 1 结束。
如果您只想要它的任何值,例如用于调试或显示,您可以使用.annotate()
,如下所示:
query = (
Shift.objects.values('shiftid', 'dayname')
.annotate(shiftdesc=Max('shiftdesc'))
.annotate(ct=Count('*')) # get count of rows in group
.order_by('shiftid', 'dayname')
.distinct()
)
查看annotations/aggregations ,可以做一些可能会有所帮助的更高级的事情,以及一些非常有用的数据库特定的事情。
完整示例
这是一个完整的示例,使用默认的 django 用户表。您没有提供足够的信息来进一步调试它。
import json
from rest_framework.serializers import *
User.objects.create(email='x1@e', first_name='Angela', last_name='Smith')
User.objects.create(email='x2@e', first_name='James', last_name='Smith')
User.objects.create(email='x3@e', first_name='James', last_name='Joyce')
query = User.objects.values('last_name') \
.order_by('last_name') \
.annotate(first_name=Max('first_name')) \
.annotate(ct=Count('email')).distinct()
class X(Serializer):
last_name = CharField()
first_name = CharField()
ct = IntegerField()
data = X(query, many=True).data
print(json.dumps(data, indent=4))
[
{
"last_name": "Joyce",
"first_name": "James",
"ct": 1
},
{
"last_name": "Smith",
"first_name": "James",
"ct": 2
}
]
关于python - QuerySet 对象没有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57176899/