Approach-1 Sử dụng một SerializerMethodField
:
Bạn có thể sử dụng một SerializerMethodField
trong serializer của bạn để thêm giá trị get_absolute_url()
để đại diện tuần tự của đối tượng.
Theo SerializerMethodField
docs:
Đây là một trường chỉ đọc. Nó nhận giá trị của nó bằng cách gọi một phương thức trên lớp serializer nó được gắn vào. Nó có thể được sử dụng để thêm bất kỳ dữ liệu nào vào đại diện được tuần tự hóa của đối tượng của bạn.
Chúng tôi sẽ xác định một phương pháp get_my_abslute_url()
cho my_absolute_url
trường trong serializer của chúng tôi mà sẽ thêm url tuyệt đối của đối tượng để các đại diện tuần tự.
class MyModelSerializer(serializers.ModelSerializer):
my_absolute_url = serializers.SerializerMethodField() # define a SerializerMethodField
def get_my_absolute_url(self, obj):
return obj.get_absolute_url() # return the absolute url of the object
Approach-2 Sử dụng URLField
với source
luận:
Bạn cũng có thể sử dụng một URLField
và vượt qua các phương pháp get_absolute_url
với nó. Điều này sẽ gọi phương thức get_absolute_url
và trả về giá trị đó trong đại diện được tuần tự hóa.
Từ docs DRF trên source
argument:
Tên của thuộc tính sẽ được sử dụng để cư lĩnh vực này. May là một phương pháp mà chỉ mất một self argument
, chẳng hạn như URLField('get_absolute_url')
, hoặc có thể sử dụng ký hiệu chấm đi qua thuộc tính, chẳng hạn như EmailField(source='user.email')
.
class MyModelSerializer(serializers.ModelSerializer):
my_absolute_url = serializers.URLField(source='get_absolute_url', read_only=True)
tôi sẽ đề nghị sử dụng phương pháp thứ 2 như DRF đã dùng đầy ý nghĩa này trong tài liệu của nó.
Nguồn
2015-10-08 14:12:24
Tôi tìm thấy rất nhiều câu trả lời trong [bài đăng liên quan] này (http://stackoverflow.com/questions/18396547/django-rest-framework-adding-additional-field-to-modelserializer) – SimonMorris