Masalah utama dengan bidang baca tulis serializer adalah dapat dengan mudah disalahgunakan. Misalnya, jika Anda memiliki model yang menyimpan data pengguna dalam bidang yang disebut "nama", Anda dapat dengan mudah membuat metode serializer yang membaca nama pengguna dari database dan menuliskannya ke bidang "nama" model. Ini akan memungkinkan Anda untuk mengakses nama pengguna dari tampilan atau template apa pun di aplikasi Anda, tanpa harus menanyakan database setiap saat.
Saya mencoba membuat bidang metode di serializer Django saya yang akan membaca dan menulis data. Bidang ini disebut "status" dan saya ingin mengembalikan "aktif" jika pengguna memiliki langganan aktif, dan "tidak aktif" jika tidak.
Ini kode saya:
class UserSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
def get_status(self, obj):
if obj.subscription_set.filter(is_active=True).exists():
return 'active'
else:
return 'inactive'
class Meta:
model = UserProfile
fields = ('username', 'email', 'first_name', 'last_name', 'status')
def update(self, instance, validated_data):
instance.username = validated_data['username']
instance.email = validated_data['email']
if validated_data['password']: # password can be empty string when updating user profile without changing password (e-mail only) - https://github.com/tomchristie/django-rest-framework/issues/3086#issuecomment-290987912 - thanks @encode! :) # noqa E501 (line too long) pylint: disable=line-too-long # noqa E501 (line too long) pylint: disable=line-too-long # noqa E501 (line too long) pylint: disable=line-too-long # noqa E501 (line too long) pylint: disable=line-too-long # noqa E501 (line too long) pylint: disable=line-too-long # noqa E501 (line too long) pylint: disable=C0301 # noqa E501 (line too long) pylint: disable=C0301 # noqa E501 (line too long) pylint: disable=C0301 # noqa E501 (l... instance.set_password(validated_data['password'])
instance.save()
return instance
Kesalahan yang saya dapatkan adalah yang ini ketika saya mencoba menyimpan data dengan permintaan PUT di klien Postman atau Insomnia REST - "detail": "Method "PUT"" not allowed."" Ini terjadi meskipun saya telah menambahkan update() metode dalam kode saya di atas seperti yang disarankan oleh posting SO lainnya pada topik serupa seperti ini di sini Django Rest Framework Serializer Method Field Update Issue . Bantuan apa pun akan dihargai! Terima kasih! 🙂