ModelSerializer sử dụng thuộc tính mô hình


95

Tôi đang cố gắng tuần tự hóa một mô hình có chứa trường thuộc tính mà tôi cũng muốn tuần tự hóa.

models.py:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    slug = models.AutoSlugField(populate_from='name')

    @property
    def ext_link(self):
        return "/".join([settings.EXT_BASE_URL, self.slug])

serializers.py:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

Khi cố gắng truy cập URL có liên quan, tôi nhận được ngoại lệ trình nối tiếp (KeyError) trên thuộc ext_linktính.

Làm thế nào tôi có thể tuần tự hóa ext_linktài sản?

Câu trả lời:


134

Bởi vì nó không phải là một trường mô hình, nó cần được thêm một cách rõ ràng vào lớp serializer

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.Field()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

5
Một lưu ý : Danh sách trường trong Meta là tùy chọn. Nếu bạn bỏ quafields, trong ví dụ trên, bạn sẽ nhận được tất cả cácMyModeltrường cộngext_linktrong dữ liệu được tuần tự hóa. Và điều này thực sự tuyệt vời cho các mô hình phức tạp! CHỈNH SỬA : Ít nhất, điều này đúng vớidjangorestframework==2.3.14.
e.thompsy

Đối với tôi, việc sử dụng serializers.Field đã xảy ra lỗi. "serializers.ReadOnlyField" không hoạt động nếu to_representation không được xác định và chế độ xem ở chế độ chỉ đọc.
Shashank Singla

13
Tôi đang sử dụng 3.3.x và chỉ cần thêm thuộc tính vào các trường là không đủ. Tôi vẫn phải thêm rõ ràng qua ext_link = serializers.ReadOnlyField ().
jarmod

4
sử dụng DRF 3.4.6 trên Python 3.5.1 và Django 1.10, việc thêm vào các trường hoạt động tốt.
Vaibhav Mishra

9
Lưu ý: Sử dụng fields = "__all__"Tôi cũng đã có thêm myfield = serializers.ReadOnlyField()như jarmod quy định, sử dụng phiên bản 3.7.7
Robert Townley

20

như @Robert Townleynhận xét của, điều này làm việc với phiên bản 3.8.2:

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.ReadOnlyField()

    class Meta:
        model = MyModel
        fields = "__all__"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.