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.