Django-REST中关系字段的KeyError

mrm*_*vin 1 django many-to-many foreign-keys django-rest-framework keyerror

我有以下型号:

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)
Run Code Online (Sandbox Code Playgroud)

和我的ModelSerializer:

class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.BasicCartItem
Run Code Online (Sandbox Code Playgroud)

我正在给出我的观点:

{'cart_product': 1}
Run Code Online (Sandbox Code Playgroud)

然后运行代码:

    m = CartSerializer(data=inputdata)
    if m.is_valid():
        items = m.data # Generates KeyError: u'cart_color'
Run Code Online (Sandbox Code Playgroud)

stacktrace的摘录:

  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'
Run Code Online (Sandbox Code Playgroud)

知识渊博的人知道这里发生了什么吗?我被困在这里几个小时,我不知道我做错了什么..

谢谢.

Rah*_*pta 6

您正在以错误的方式访问数据.您应该访问.validated_data序列化程序而不是.data.

m = CartSerializer(data=inputdata)
if m.is_valid():
    items = m.validated_data # access validated data here
Run Code Online (Sandbox Code Playgroud)

为什么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
Run Code Online (Sandbox Code Playgroud)