2013-02-15 3 views
2

У меня есть следующий класс сериализаторов.Django: Показывает имя пользователя, а не ID, как?

class ProfileSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Profile 
     fields = ('id', 'name', 'active', 'type', 'user') 

При перечислении всех профилей поле пользователя показывает идентификатор пользователя. Как изменить это, чтобы показать user.username? Я знаю, что с моими моделями я просто добавляю это в свой мета-класс, но так как не создал пользовательскую модель (ее часть Django). Как сообщить Django при вызове пользователя, чтобы показать имя пользователя, а не идентификатор?

Большое спасибо.

ответ

4

два очевидных способа вы можете иметь дело с этим:

Во-первых, вы можете использовать dotted.notation, чтобы заставить source argument в user поле, чтобы быть user.username вместо стандартного user.

class ProfileSerializer(serializers.ModelSerializer): 
    user = serializers.Field(source='user.username') 

    class Meta: 
     model = Profile 
     fields = ('id', 'name', 'active', 'type', 'user') 

Обратите внимание, что Field является стандартным полем только для чтения, так что вы не смогли бы обновить пользователь с помощью этого сериалайзера.

В качестве альтернативы, если вы хотите, чтобы пользователь записываемого поля, вы можете использовать SlugRelatedField как так ...

class ProfileSerializer(serializers.ModelSerializer): 
    user = serializers.SlugRelatedField(slug_field='username') 

    class Meta: 
     model = Profile 
     fields = ('id', 'name', 'active', 'type', 'user') 

Если вы хотите, вы можете также использовать второй подход, но использовать поле только для чтения , добавив read_only=True к SlugField.

+0

ты звезда! еще раз спасибо. Я принимаю все это :) – Prometheus

+0

: p Надеюсь, все полезные материалы и что вы добиваетесь прогресса. –

1

Эта ветка устарела, но поскольку я недавно включил ту же проблему, я бы хотел добавить к ней современный ответ. Мы должны пользователь встроенный SerializerMethodField() из ФПИ, как это:

class ProfileSerializer(serializers.ModelSerializer): 
    user = serializers.SerializerMethodField() 

    def get_user(self, obj): 
     return obj.user.username 

    class Meta: 
     model = Profile 
     fields = ('id', 'name', 'active', 'type', 'user') 
Смежные вопросы