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