【问题标题】:'QuerySet' object has no attribute 'simplified'“QuerySet”对象没有“简化”属性
【发布时间】:2021-07-09 22:03:21
【问题描述】:

我正在尝试执行一个相当简单的 GET 请求,该请求会导致使用 DRF 进行查询:

def get(self, request, character):
    char_entry = Dictionary.objects.filter(Q(simplified=character) | Q(traditional=character))
    serializer = DictionarySerializer(char_entry)
    return Response({"character": serializer.data})

我的 DictionarySerializer 看起来像这样:

从 rest_framework 导入序列化程序 从 .models 导入字典

class DictionarySerializer(serializers.ModelSerializer):

    class Meta:
        model = Dictionary
        fields = ["id", "simplified", "pinyin_numbers", "pinyin_marks", "translation", "level", "traditional", ]

我的 Dictionary 模型如下所示:

class Dictionary(models.Model):
    traditional = models.CharField(max_length=50)
    simplified = models.CharField(max_length=50)
    pinyin_numbers = models.CharField(max_length=50)
    pinyin_marks = models.CharField(max_length=50)
    translation = models.TextField()
    level = models.IntegerField()

    class Meta:
        db_table = 'dictionary'
        indexes = [
            models.Index(fields=['simplified', ]),
            models.Index(fields=['traditional', ]),
        ]

据我所知,这应该序列化 Dictionary 表中的所有字段,包括简化字段。

为什么 Django 找不到属性?我错过了什么?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    QuerySet 是项目的集合。因此它可以包含零个、一个或多个项目。您需要使用many=True 参数进行序列化:

    def get(self, request, character):
        char_entry = Dictionary.objects.filter(
            Q(simplified=character) | Q(traditional=character)
        )
        serializer = DictionarySerializer(char_entry, many=True)
        return Response({'character': serializer.data})

    或者如果我们知道只有一项,我们应该检索那一项:

    from django.shortcuts import get_object_or_404
    
    def get(self, request, character):
        char_entry = get_object_or_404(
            Dictionary,
            Q(simplified=character) | Q(traditional=character)
        )
        serializer = DictionarySerializer(char_entry, many=True)
        return Response({'character': serializer.data})

    【讨论】:

    • @StevenMatthews: 那么你应该使用.get(...) 来检索一个对象,而不是对象的QuerySet,或者get_object_or_404 更好,因为它返回一个HTTP 404响应,以防找不到对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2020-06-20
    • 2021-06-12
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多