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?

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

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__"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.