ModelSerializer menggunakan properti model

101

Saya mencoba membuat serial model yang berisi bidang properti yang juga ingin saya buat bersambung.

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')

Saat mencoba untuk mendapatkan ke URL terkait, saya mendapatkan pengecualian serializer (KeyError) pada ext_linkproperti.

Bagaimana saya bisa membuat serial ext_linkproperti?

Sander Smits
sumber

Jawaban:

138

Karena ini bukan kolom model, ia perlu ditambahkan secara eksplisit ke kelas serializer

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

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')
Tom Christie
sumber
5
Satu catatan : Daftar bidang di Meta adalah opsional. Jika Anda menghilangkanfields, dalam contoh di atas, Anda akan mendapatkan semuaMyModelkolom plusext_linkdi data serial. Dan ini sangat bagus untuk model yang kompleks! EDIT : Setidaknya, ini benar untukdjangorestframework==2.3.14.
e.thompsy
Bagi saya, menggunakan serializers.Field memberikan kesalahan. "serializers.ReadOnlyField" berfungsi jika to_representation tidak ditentukan dan tampilan hanya-baca.
Shashank Singla
15
Saya menggunakan 3.3.x dan hanya menambahkan properti ke bidang tidak cukup. Saya masih harus menambahkan secara eksplisit melalui ext_link = serializers.ReadOnlyField ().
jarmod
4
menggunakan DRF 3.4.6 pada Python 3.5.1 dan Django 1.10, menambah bidang berfungsi dengan baik.
Vaibhav Mishra
9
Catatan: Menggunakan fields = "__all__"saya juga harus menambahkan myfield = serializers.ReadOnlyField()sebagai jarmod yang ditentukan, menggunakan versi 3.7.7
Robert Townley
22

sebagai @Robert Townleykomentar, ini bekerja dengan versi 3.8.2:

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

    class Meta:
        model = MyModel
        fields = "__all__"
suhailvs
sumber