Как добавить внешний ключ к имени пользователя. REST-фреймворк Джанго

Во время сериализации я заметил, что внешний ключ post_author модели Post ссылается на идентификатор создателя, и поэтому я не могу отобразить имя пользователя создателя в REST API, только идентификатор post_author. Как я могу добавить имя пользователя post_creator, чтобы его могли читать другие пользователи, когда я извлекаю данные из внешнего интерфейса?

models.py // CustomUser = создатель сообщения.

class CustomUser(AbstractUser):
    fav_color = models.CharField(blank=True, max_length=120)

class Post(models.Model):
    post_author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='posts')
    post_title = models.CharField(max_length=200)
    post_body = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return self.post_title

views.py

@api_view(['GET'])
def post_list(request):
    posts = Post.objects.all()
    serializer = PostSerializer(posts, many=True)
    return Response(serializer.data)

serializers.py модель пользователя и сериализация после модели

class CustomUserSerializer(serializers.ModelSerializer):
    """
    Currently unused in preference of the below.
    """
    email = serializers.EmailField(required=True)
    username = serializers.CharField()
    password = serializers.CharField(min_length=8, write_only=True)

    class Meta:
        model = CustomUser
        fields = ('email', 'username', 'password')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        password = validated_data.pop('password', None)
        # as long as the fields are the same, we can just use this
        instance = self.Meta.model(**validated_data)
        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

отдельная запись из API

{
    "id": 1,
    "post_title": "first_post",
    "post_body": "qwe1",
    "created_date": "2020-11-17T19:30:55Z",
    "published_date": null,
    "post_author": 1
},

person gonzo8874    schedule 18.11.2020    source источник


Ответы (2)


Вам нужно переопределить сериализатор:

class PostSerializer(serializers.ModelSerializer):
    post_author_username = serializers.ReadOnlyField(source="post_author.username")

    class Meta:
        model = Post
        fields = [post_author_username, post_title, post_body, created_data, published_data]
person pplonski    schedule 18.11.2020
comment
Благодарю вас! Кажется, что добавление post_author_username = serializers.ReadOnlyField(source="post_author.username") и оставление fields = '__all__' также работает. - person gonzo8874; 18.11.2020

Вы можете указать сериализатор post_author в вашем PostSerializer:

class PostSerializer(serializers.ModelSerializer):
    post_author=CustomUserSerializer(read_only=True)
    
    class Meta:
        model = Post
        fields = '__all__'

Документацию можно посмотреть здесь

person kaajavi    schedule 18.11.2020