2013-02-21 26 views
16

Tôi đang sử dụng khuôn khổ còn lại django và chỉ cần tạo ra một serializer đơn giản như thế này:id trường trong serializer django khuôn khổ còn lại

class PackageSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Package 
     fields = ('id','url', 'title','location') 

Tuy nhiên tôi nhận được lỗi này

KeyError at /cerberus/packages/ 
'id' 

Tại sao tôi có thể' t lấy khóa chính 'id' như một phần của dữ liệu được tuần tự hóa của tôi? Cảm ơn bạn đã trợ giúp!

Trả lời

43

HyperlinkedModelSerializer không bao gồm id theo mặc định. Trong 2.2 và trước đó bạn sẽ cần phải thêm nó một cách rõ ràng như một lĩnh vực ...

class PackageSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 

    class Meta: 
     model = Package 
     fields = ('id','url', 'title','location') 

Từ 2.3 trở đi, bạn chỉ có thể thêm 'id' đến tùy chọn fields ...

class PackageSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Package 
     fields = ('id','url', 'title','location') 

từ 3.x trở đi, bạn phải sử dụng ReadOnlyField() thay vì Field() nếu bạn muốn thêm nó một cách rõ ràng và không sử dụng tùy chọn fields ...

class PackageSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.ReadOnlyField() 

    class Meta: 
     model = Package 
+0

Mẹo này đã giúp tôi thông qua Hướng dẫn về rest_framework [link] (http://www.django-rest-framework.org/tutorial/1-serialization#using-modelserializers). Trong hướng dẫn ở đó bạn có một dòng 'pk = serializers.Field()', nhưng nó phải là 'id = serializers.Field()'. Tôi giám sát lỗi đánh máy đó. – Semo

+2

Bây giờ nó sẽ là 'id = serializers.ReadOnlyField()' cho Django Rest Framework 3.x – rrauenza

+0

Cảm ơn .. Giải thích tốt !! –

0

tôi chỉ twea ked này để làm cho nó nhiều hơn một chút cắm bằng cách tạo lớp này:

class HyperlinkedModelSerializerWithId(serializers.HyperlinkedModelSerializer): 
    """Extend the HyperlinkedModelSerializer to add IDs as well for the best of 
    both worlds. 
    """ 
    id = serializers.ReadOnlyField() 

Sau đó, chỉ cần sử dụng để làm cho serializer của bạn và bạn đang trên con đường của bạn.

Các vấn đề liên quan