gpt4 book ai didi

python - QuerySet 对象没有属性

转载 作者:行者123 更新时间:2023-12-01 07:31:46 24 4
gpt4 key购买 nike

当我从数据库中选择不同的值时遇到问题。

这是我的模型:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com