python - QuerySet 对象没有属性

标签 python django

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

这是我的模型:

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/

相关文章:

python - Django Rest Framework ListCreateAPIView 不检查 has_object_permissions?

django - 无法在 Ubuntu 上安装 gunicorn

python - 带有 q 列表的多级列 MultiIndex groupby 对象上的 Pandas 分位数

python - 为什么我的 Django 用户模型的密码没有经过哈希处理?

android - python 和 (android) adb shell

python - 错误 : Unsupported format, 或损坏的文件:预期的 BOF 记录

python - 返回 JSON 浮点值

django - Docker:从Web容器内部执行将django迁移到db容器

python - Django 随机排序列表

python - django中的测试设置错误。 self 没有过去。