2015-04-01 17 views
7

Tôi đã cố gắng thay đổi giá trị của một trường biểu mẫu bảng quản trị khung của khung công tác REST của Django và vì một lý do nào đó thay đổi không bao giờ xảy ra. Tôi có serializer dướiVượt qua serializer.data trong khung hình Django REST

class SomeView(ModelViewSet): 
    queryset = MyModel.objects.all() 
    serializer_class = MyModelSerializer 

    # I Want to override this and change the POST data 
    def perform_create(self, serializer): 
    user = self.request.user.id 

    # this was a form field where I manually entered the user ID 
    # I now want it to default to the logged in user 
    serializer.data['user'] = user 

    # This returns the original user that was entered into the form field 
    print serializer.data 

Tôi đã kiểm tra ra serializer.data với dir() và nó chỉ là một cuốn từ điển python vì vậy tôi không thể tìm ra lý do tại sao tôi không thể thay đổi giá trị. Là một thử nghiệm tôi đã cố gắng để thêm giá trị thêm nhưng điều đó không làm việc, hoặc

# this doesnt work 
serializer.data['some_new_field'] = 'test' 

EDIT

Ngày lưu ý khác, tôi có thể sao chép dữ liệu và chỉnh sửa nó

fake_data = serializer.data.copy() 
fake_data['old_value'] = 'new value' 

Tuy nhiên nó luôn luôn không xác thực được

serializer = MyModelSerializer(data=fake_data) 
serializer.is_valid() # returns false 

EDIT EDIT:

Ok, do đó, lỗi xác thực đã được gây ra bởi Django trả về một SimpleLazyObject. Tất cả mọi thứ hoạt động ngay bây giờ khi tôi thực hiện một bản sao trên dữ liệu, nhưng tôi thực sự tò mò là tại sao tôi không thể chỉnh sửa trực tiếp serializer.data mà không cần sao chép nó. Vấn đề được giải quyết ngay bây giờ, nhưng nếu bất cứ ai có thể cung cấp thông tin chi tiết về vấn đề này chỉ vì sự tò mò, điều đó thật tuyệt vời.

Trả lời

7

Tôi đã kiểm tra serializer.data bằng dir() và nó chỉ là từ điển python vì vậy tôi không thể hiểu tại sao tôi không thể sửa đổi giá trị.

Mặc dù thu hồi giá trị từ Serializer.data thực sự là một cuốn từ điển, Serializer.data không phải là một biến Ví dụ đơn giản.

Nếu bạn nhìn vào rest_framework/serializers.py:

class Serializer(BaseSerializer): 
    # [...] 
    @property 
    def data(self): 
     ret = super(Serializer, self).data 
     return ReturnDict(ret, serializer=self) 

ReturnDict thừa hưởng từ OrderedDict, nhưng bạn vẫn nhận được một cuốn từ điển mới mỗi khi bạn truy cập vào Serializer.data.

Dữ liệu thực ở mức _data, tuy nhiên như đã nêu trong dấu gạch dưới, bạn có thể không muốn sửa đổi hoặc vì nó không có ý định công khai. Các giá trị được điền bởi Serializer.to_representation() mà bạn có thể ghi đè trên viewset.

Đối với phần thứ hai: ModelViewSet xác định get_serializer() được gọi với dữ liệu POST yêu cầu để tạo bộ nối tiếp bạn muốn sửa đổi. Tôi muốn đề nghị cố gắng thay đổi dữ liệu đầu vào trước khi bộ nối tiếp được tạo ra, thay vào đó.

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