首页 > 解决方案 > 组合 2 个模型时在 Django 序列化程序上出现关键错误

问题描述

美好的一天。我想在一个 django 序列化程序中组合两个模型。我只想先把它们放在一个序列化程序中,剩下的我可以做。基于其他 SO question,我需要首先声明一个序列化程序并将其添加到我的第二个序列化程序中。但这给了我一个错误。我以为我只需要使用专业这个词并将其声明到我的次要领域。

class PrefectureMajorSerializer(serializers.ModelSerializer):

    id = serializers.IntegerField()
    text = serializers.CharField(source='prefecture_name')

    class Meta:
        model = PrefectureMajor
        fields = ["id", "text"]

class PrefectureSerializer(serializers.ModelSerializer):

    id = serializers.IntegerField()
    text = serializers.CharField(source='prefecture_name')
    major = PrefectureMajorSerializer()

    class Meta:
        model = PrefectureMinor
        fields = ['id', 'text', 'prefecture_major_id', 'major']

楷模:

class PrefectureMajor(models.Model):
    prefecture_name = models.CharField(max_length=100, default='', null=False)
    is_active = models.BooleanField(default=True, null=False)
    
    def __str__(self):
        return self.prefecture_name

class PrefectureMinor(models.Model):
    prefecture_major = models.ForeignKey("PrefectureMajor", related_name="PrefectureMinor.prefecture_name +", on_delete=models.CASCADE)
    prefecture_name = models.CharField(max_length=100, default='', null=False)
    is_active = models.BooleanField(default=True, null=False)
    
    def __str__(self):
        return self.prefecture_name

回溯错误消息:

C:\Users\SOMEPATH\.virtualenvs\DjangoProjects-k8989gUR\lib\site-packages\rest_framework\fields.py, line 457, in get_attribute
            return get_attribute(instance, self.source_attrs) …
▼ Local vars
Variable    Value
instance    
{'id': 1, 'is_active': True, 'prefecture_major_id': 2, 'prefecture_name': '北海道'}
msg 
('Got KeyError when attempting to get a value for field `major` on serializer '
 '`PrefectureSerializer`.\n'
 'The serializer field might be named incorrectly and not match any attribute '
 'or key on the `dict` instance.\n'
 "Original exception text was: 'perfecture_major'.")
self    
PrefectureMajorSerializer(source='perfecture_major'):
    id = IntegerField()
    text = CharField(source='prefecture_name')
C:\Users\SOMEPATH\.virtualenvs\DjangoProjects-k8989gUR\lib\site-packages\rest_framework\fields.py, line 95, in get_attribute
                instance = instance[attr] …
▼ Local vars
Variable    Value
attr    
'perfecture_major'
attrs   
['perfecture_major']
instance    
{'id': 1, 'is_active': True, 'prefecture_major_id': 2, 'prefecture_name': '北海道'}

看法:

def get_all_prefectures(request):
    prefecture_list = PrefectureMinor.objects.filter(is_active=True).order_by("id").values()
    prefecture_serializer = PrefectureSerializer(prefecture_list, many=True)
    data = prefecture_serializer.data
    
    return JsonResponse(data, safe=False)

标签: django

解决方案



推荐阅读