Saya ingin membuat serial suatu model, tetapi ingin memasukkan bidang tambahan yang mengharuskan dilakukannya beberapa pencarian basis data pada contoh model yang akan diserialisasi:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
Apa cara yang tepat untuk melakukan ini? Saya melihat bahwa Anda dapat meneruskan "konteks" ekstra ke serializer, apakah jawaban yang tepat untuk diteruskan di bidang tambahan dalam kamus konteks? Dengan pendekatan itu, logika mendapatkan bidang yang saya butuhkan tidak akan mandiri dengan definisi serializer, yang ideal karena setiap instance serial akan perlu my_field
. Di tempat lain dalam dokumentasi serialisator DRF dikatakan "bidang tambahan dapat sesuai dengan properti apa pun atau dapat dipanggil pada model". Apakah bidang tambahan yang saya bicarakan? Haruskah saya mendefinisikan fungsi dalam Foo
definisi model yang mengembalikan my_field
nilai, dan dalam serializer saya menghubungkan my_field ke callable itu? Seperti apa itu?
Terima kasih sebelumnya, senang untuk menjelaskan pertanyaan jika perlu.
field_name = serializers.SerializerMethodField()
dandef get_field_name(self, obj):
foo
saat def sebuah SerializerMethodField? ketika menggunakan CreateAPIView, apakah foo telah disimpan kemudian dapat menggunakan metode is_named_bar ()?Anda dapat mengubah metode model Anda menjadi properti dan menggunakannya dalam serializer dengan pendekatan ini.
Sunting: Dengan versi terbaru kerangka istirahat (saya mencoba 3.3.3), Anda tidak perlu mengubah ke properti. Metode model hanya akan berfungsi dengan baik.
sumber
variable = model_instance.my_field
memberikan hasil yang sama sepertivariable = model_instance.my_field()
tanpa dekorator. juga: stackoverflow.com/a/6618176/2198571source='my_field'
tidak membutuhkan lagi dan mengajukan pengecualianDengan versi terakhir Django Rest Framework, Anda perlu membuat metode dalam model Anda dengan nama bidang yang ingin Anda tambahkan. Tidak perlu
@property
dansource='field'
memunculkan kesalahan.sumber
request
objek di dalam def foo (self) yang dapat mengubah nilai foo? (contoh pencarian berdasarkan request.user)Respons saya terhadap pertanyaan serupa (di sini ) mungkin berguna.
Jika Anda memiliki Metode Model yang didefinisikan dengan cara berikut:
Anda dapat menambahkan hasil dari memanggil metode tersebut ke serializer Anda seperti:
ps Karena bidang khusus bukan benar-benar bidang dalam model Anda, Anda biasanya ingin membuatnya hanya baca, seperti:
sumber
jika Anda ingin membaca dan menulis di bidang tambahan Anda, Anda dapat menggunakan serializer khusus baru, yang meluas serializers. Serializer, dan menggunakannya seperti ini
saya menggunakan ini dalam bidang bersarang terkait dengan beberapa logika khusus
sumber
Ini berhasil untuk saya . Jika kita hanya ingin menambahkan bidang tambahan
ModelSerializer
, kita dapat melakukannya seperti di bawah ini, dan juga bidang tersebut dapat diberikan beberapa val setelah beberapa perhitungan pencarian. Atau dalam beberapa kasus, jika kami ingin mengirim parameter dalam respons API.Di model.py
Di serializer.py
Semoga ini bisa membantu seseorang.
sumber
Seperti yang dikatakan Programer Kimia dalam komentar ini , dalam DRF terbaru Anda bisa melakukannya seperti ini:
Sumber dokumen DRF
sumber