首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyError Post DjangoRestFramework

KeyError Post DjangoRestFramework
EN

Stack Overflow用户
提问于 2020-05-05 22:45:04
回答 1查看 195关注 0票数 0

我是Django Rest框架的新手,当我想发布数据时,我会得到一个错误:KeyError:'id_area',我不知道我做错了什么。这是我的密码:

在我的models.py里

代码语言:javascript
复制
class Area(models.Model):
id_area = models.AutoField(primary_key=True)
APM = 'apm'
BUSINESS = 'business'
DESARROLLO = 'desarrollo'
SISTEMAS = 'sistemas'

ATENTUSIANOS_CHOICES = (
    (APM, 'Apm'),
    (BUSINESS, 'Business'),
    (DESARROLLO, 'Desarrollo'),
    (SISTEMAS, 'Sistemas'),
)

nombre = models.CharField(max_length=255, choices=ATENTUSIANOS_CHOICES)

class Meta:
    verbose_name = 'Área'
    verbose_name_plural = 'Áreas'

def __str__(self):
    return self.nombre

class Atentusiano(models.Model):
id_atentusiano = models.AutoField(primary_key=True)
nombre = models.CharField(max_length=255, blank=False, null=False)
apellido = models.CharField(max_length=255, blank=False, null=False)
correo = models.CharField(max_length=255, blank=False, null=False, unique=True)
anexo = models.CharField(max_length=255, blank=True, null=True)
area = models.ForeignKey(Area, related_name='areas', on_delete=models.CASCADE)

class Meta:
    verbose_name = 'Atentusiano'
    verbose_name_plural = 'Atentusianos'
    ordering = ['nombre']

def __str__(self):
    return self.nombre + ' ' + self.apellido

在我的serializers.py里

代码语言:javascript
复制
class AreaSerializer(serializers.ModelSerializer):
areas = serializers.CharField(read_only=True)
class Meta:
    model = Area
    fields = ('id_area', 'nombre', 'areas')

class AtentusianoSerializer(serializers.ModelSerializer):
atentusianos = serializers.CharField(read_only=True)
area = serializers.CharField(source='area.nombre', read_only=True)
id_area = serializers.CharField(source='area.id_area')

class Meta:
    model = Atentusiano
    fields = ['id_atentusiano', 'nombre', 'apellido', 'correo', 'anexo', 'id_area', 'area', 'atentusianos']

def create(self, validated_data):
    area_data = validated_data.pop('id_area')
    area = models.Area.objects.create(**area_data)
    atentusiano = models.Atentusiano.objects.create(area=area, **validated_data)
    return atentusiano

在我的views.py里

代码语言:javascript
复制
class AtentusianoView(viewsets.ModelViewSet):
queryset = Atentusiano.objects.all()
serializer_class = AtentusianoSerializer

class AreaView(viewsets.ModelViewSet):
queryset = Area.objects.all()
serializer_class = AreaSerializer

问题是,当我想要发布数据时,例如:{ "nombre":"name","apellido":"lastname","correo":"email@gmail.com","anexo":"1364","id_area":"1“}

我得到了一个错误area_data = validated_data.pop('id_area') KeyError:'id_area'

我需要帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-06 12:19:18

你应该像这样pop

代码语言:javascript
复制
class AtentusianoSerializer(serializers.ModelSerializer):
    .....
    .....

class Meta:
    model = Atentusiano
    fields = ['id_atentusiano', 'nombre', 'apellido', 'correo', 'anexo', 'id_area', 'area', 'atentusianos']

def create(self, validated_data):
    id_area = validated_data.pop('area')['id_area'] # here the correction
    area = Area.objects.create(id_area=id_area) # an additional correction
    atentusiano = Atentusiano.objects.create(area=area, **validated_data)
    return atentusiano

编辑:作为id_area值,您将传递一个string而不是将通过另一个错误的integer。也不是,

area = models.Area.objects.create(**area_data)

应该是,

area = Area.objects.create(id_area=id_area)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61624332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档