Как получить детали вложенного объекта в сериализаторе в DRF - PullRequest
0 голосов
/ 06 апреля 2020

Итак, я пытаюсь создать сериализатор, который бы возвращал кучу деталей модели 'Post' в моем проекте, но я также хочу получить подробности о вложенном объекте, вывод которого я покажу ниже :
Пост-модель:

class Post(models.Model):

    # Base post attributes
    user = models.ForeignKey(UserOfApp, related_name="posts", on_delete=models.CASCADE)
    ...
    # Repost post attributes
    original_repost = models.ForeignKey(
        to="self",
        related_name="reposted_post",
        null=True,
        blank=True,
        on_delete=models.CASCADE,
    )

    # Quote post attributes
    is_quote_post = models.BooleanField(default=False)
    quoted_post = models.ForeignKey(
        to="self", null=True, blank=True, on_delete=models.CASCADE
    )
    ...

Мой сериализатор, использующий глубину:

class HomeSerializer(serializers.ModelSerializer):

    id_str = serializers.ReadOnlyField()
    ...
    quoted_post_id_str = serializers.ReadOnlyField()

    class Meta:
        model = Post
        depth = 2
        fields = "__all__"

Это дает мне вывод Например, проблема в том, что он возвращает все конфиденциальные данные из моей пользовательской модели, например, «пароль» и т. д. c:

{
        "id": 16,
        ...
        "is_quote_post": false,
        "user": {
            "id": 1,
            "password": "pbkdf2_sha256$180000$ni6drJvLjUU2$xoMt5tpJmz8TlmORfB/eTkYlGGpUGfriGz8rO7kVB8E=",
            "last_login": "2020-03-21T06:20:48Z",
            "is_superuser": true,
            "username": "manas",
            "first_name": "Manas",
            "last_name": "Acharekar",
            "email": "manas.acharekar98@gmail.com",
            "is_staff": true,
            "is_active": true,
            "date_joined": "2020-03-01T18:42:11Z",
            "dob": "1998-11-11",
            "gender": "M",
            "bio": "i own this place",
            "location": "",
            "website": "",
            "verified": true,
            "followers": [],
            "friends": [],
            "groups": [],
            "user_permissions": []
        },
        "original_repost": {
            "id": 1,
            ...
            "user": {
                "id": 1,
                "password": "pbkdf2_sha256$180000$ni6drJvLjUU2$xoMt5tpJmz8TlmORfB/eTkYlGGpUGfriGz8rO7kVB8E=",
                "last_login": "2020-03-21T06:20:48Z",
                "is_superuser": true,
                "username": "manas",
                "first_name": "Manas",
                "last_name": "Acharekar",
                "email": "manas.acharekar98@gmail.com",
                "is_staff": true,
                "is_active": true,
                "date_joined": "2020-03-01T18:42:11Z",
                "dob": "1998-11-11",
                "gender": "M",
                "bio": "i own this place",
                "location": "",
                "website": "",
                "verified": true,
                "followers": [],
                "friends": [],
                "groups": [],
                "user_permissions": []
            },
            "original_repost": null,
            "quoted_post": null
        },
        "quoted_post": null
    }

Мой сериализатор, без использования глубины:

class HomeSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    id_str = serializers.ReadOnlyField()
    ...
    quoted_post_id_str = serializers.ReadOnlyField()
    quoted_post = PostSerializer()
    original_repost = PostSerializer()

    class Meta:
        model = Post
        fields = "__all__"

Это выводит сообщения должным образом, но я не могу получить полный вложенный объект. В возврате JSON, указанном ниже, я хочу получить доступ к quoted_post.user или original_repost.user , но возвращается только внешний ключ:

{
        "id": 16,
        "user": {
            "id": 1,
            "followers_count": 0,
            "friends_count": 0,
            "username": "manas",
            "first_name": "Manas",
            "last_name": "Acharekar",
            "email": "manas.acharekar98@gmail.com",
            "date_joined": "2020-03-01T18:42:11Z",
            "dob": "1998-11-11",
            "gender": "M",
            "bio": "i own this place",
            "location": "",
            "website": "",
            "verified": true,
            "followers": [],
            "friends": []
        },
        "id_str": "16",
        ...
        "quoted_post": null,
        "original_repost": {
            "id": 1,
            ...
            "is_quote_post": false,
            "user": 1,
            "original_repost": null,
            "quoted_post": null
        },
        ...
        "is_quote_post": false
    }

Как именно решить эту проблему?

1 Ответ

0 голосов
/ 07 апреля 2020

В вашем случае лучше всего модифицировать PostSerializer ().

class PostSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = Post
        fields = "__all__"

class HomeSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    id_str = serializers.ReadOnlyField()
    ...
    quoted_post_id_str = serializers.ReadOnlyField()
    quoted_post = PostSerializer()
    original_repost = PostSerializer()

    class Meta:
        model = Post
        fields = "__all__"

Кроме того, я бы рекомендовал не использовать __ all __ , поскольку это может выявить некоторые ненужные данные.

Попробуйте явно определить поля, которые вы хотите показать

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ["first_name","last_name" ]

...