Model özelliğini kullanarak ModelSerializer


100

Ayrıca serileştirmek istediğim bir özellik alanı içeren bir modeli serileştirmeye çalışıyorum.

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

İlgili URL'ye ulaşmaya çalışırken, ext_linkmülkte bir serileştirici istisnası (KeyError) alıyorum .

ext_linkMülkü nasıl seri hale getirebilirim ?

Yanıtlar:


138

Bir model alanı olmadığı için, serileştirici sınıfına açıkça eklenmesi gerekir.

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

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

5
Bir not : Meta'daki alanlar listesi isteğe bağlıdır. fieldsYukarıdaki örnekteatlarsanız, tümMyModelalanları artıext_linkserileştirilmiş verilerdeelde edersiniz. Ve bu, karmaşık modeller için gerçekten harika! DÜZENLEME : En azından bu doğrudjangorestframework==2.3.14.
e.thompsy

Benim için serializers.Field kullanmak bir hata verdi. to_representation tanımlı değilse ve görünüm salt okunur ise "serializers.ReadOnlyField" çalışır.
Shashank Singla

15
3.3.x kullanıyorum ve sadece alanlara özellikler eklemek yeterli değil. Hala ext_link = serializers.ReadOnlyField () yoluyla açıkça eklemem gerekiyor.
jarmod

4
Python 3.5.1 ve Django 1.10 üzerinde DRF 3.4.6 kullanarak, alanlara eklemek iyi çalışıyor.
Vaibhav Mishra

9
Not: 3.7.7 sürümünü kullanarak jarmod'u da belirtildiği gibi fields = "__all__"eklemek zorunda kaldımmyfield = serializers.ReadOnlyField()
Robert Townley

22

olarak @Robert Townleyun yorumunu sürümü ile bu işin 3.8.2:

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

    class Meta:
        model = MyModel
        fields = "__all__"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.