Django-REST 中关系字段的 KeyError
KeyError on relation field in Django-REST
我有以下型号:
class ProductColor(models.Model):
color_title = models.CharField(max_length=50)
class BasicProduct(models.Model):
product_title = models.CharField(max_length=150)
product_desc = models.TextField()
product_price = models.FloatField(default=10.0)
# Describes what colors are available for this product
product_colors = models.ManyToManyField(ProductColor)
class BasicCartItem(models.Model):
cart_product = models.ForeignKey(BasicProduct)
cart_color = models.ForeignKey(ProductColor, blank=True, default=None, null=True)
还有我的 ModelSerializer:
class CartSerializer(serializers.ModelSerializer):
class Meta:
model = models.BasicCartItem
我的观点是:
{'cart_product': 1}
然后运行代码:
m = CartSerializer(data=inputdata)
if m.is_valid():
items = m.data # Generates KeyError: u'cart_color'
堆栈跟踪提取:
File "python2.7/site-packages/rest_framework/serializers.py", line 430, in to_representation
attribute = field.get_attribute(instance)
File "python2.7/site-packages/rest_framework/relations.py", line 103, in get_attribute
return get_attribute(instance, self.source_attrs)
File "python2.7/site-packages/rest_framework/fields.py", line 69, in get_attribute
instance = instance[attr]
KeyError: u'cart_color'
有识之士知道这是怎么回事吗?我被困在这里好几个小时了,我不知道自己做错了什么..
谢谢。
您正在以错误的方式访问数据。您应该 在序列化器上访问 .validated_data
而不是 .data
.
m = CartSerializer(data=inputdata)
if m.is_valid():
items = m.validated_data # access validated data here
为什么 serializer.data
方法对您的情况不起作用?
当您执行 .data
时,序列化程序将尝试序列化 initial_data
,因为您没有传递 instance
参数。它会期望所有字段都存在,但由于 cart_color
不存在于数据中,它会引发 KeyError
。
那一般什么时候用serializer.data
呢?
序列化现有对象时,通常应使用 serializer.data
。这将要求您在创建序列化程序实例时传递 instance
参数。
m = CartSerializer(instance=my_object)
items = m.data # use .data when serializing an object
我有以下型号:
class ProductColor(models.Model):
color_title = models.CharField(max_length=50)
class BasicProduct(models.Model):
product_title = models.CharField(max_length=150)
product_desc = models.TextField()
product_price = models.FloatField(default=10.0)
# Describes what colors are available for this product
product_colors = models.ManyToManyField(ProductColor)
class BasicCartItem(models.Model):
cart_product = models.ForeignKey(BasicProduct)
cart_color = models.ForeignKey(ProductColor, blank=True, default=None, null=True)
还有我的 ModelSerializer:
class CartSerializer(serializers.ModelSerializer):
class Meta:
model = models.BasicCartItem
我的观点是:
{'cart_product': 1}
然后运行代码:
m = CartSerializer(data=inputdata)
if m.is_valid():
items = m.data # Generates KeyError: u'cart_color'
堆栈跟踪提取:
File "python2.7/site-packages/rest_framework/serializers.py", line 430, in to_representation
attribute = field.get_attribute(instance)
File "python2.7/site-packages/rest_framework/relations.py", line 103, in get_attribute
return get_attribute(instance, self.source_attrs)
File "python2.7/site-packages/rest_framework/fields.py", line 69, in get_attribute
instance = instance[attr]
KeyError: u'cart_color'
有识之士知道这是怎么回事吗?我被困在这里好几个小时了,我不知道自己做错了什么..
谢谢。
您正在以错误的方式访问数据。您应该 在序列化器上访问 .validated_data
而不是 .data
.
m = CartSerializer(data=inputdata)
if m.is_valid():
items = m.validated_data # access validated data here
为什么 serializer.data
方法对您的情况不起作用?
当您执行 .data
时,序列化程序将尝试序列化 initial_data
,因为您没有传递 instance
参数。它会期望所有字段都存在,但由于 cart_color
不存在于数据中,它会引发 KeyError
。
那一般什么时候用serializer.data
呢?
序列化现有对象时,通常应使用 serializer.data
。这将要求您在创建序列化程序实例时传递 instance
参数。
m = CartSerializer(instance=my_object)
items = m.data # use .data when serializing an object