2013-06-12 3 views
49

Próbuję serializować model zawierający pole właściwości, które również chcę serializować.ModelSerializer za pomocą właściwości modelu

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

Kiedy próbuje dostać się do powiązanego adresu URL, dostaję wyjątek serializer (KeyError) na nieruchomości ext_link.

Jak można przekształcić do postaci szeregowej właściwość ext_link?

Odpowiedz

78

Bo to nie jest pole modelu, musi być dodana bezpośrednio do klasy serializer

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

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

Edit: W ramach REST 3 dodając do fields po prostu działa - nie trzeba dodać pole jawnie.

+0

Dzięki! Działa teraz. –

+3

*** Jedna uwaga ***: Lista pól w Meta jest opcjonalna. Jeśli pominiesz 'fields', w powyższym przykładzie, otrzymasz wszystkie pola' MyModel' oraz 'ext_link' w zserializowanych danych. A to jest naprawdę niesamowite dla złożonych modeli! * EDYCJA *: Przynajmniej dotyczy to 'djangorestframework == 2.3.14'. –

+0

Dla mnie za pomocą serializers.Field dał błąd. "serializers.ReadOnlyField" działa, jeśli to_representation nie jest zdefiniowane, a widok jest tylko do odczytu. –