Как сериализовать модель Django с несколькими самоссылающимися полями с глубиной 1 - PullRequest
0 голосов
/ 13 июня 2019

Как мне сериализовать мою модель без бесконечной рекурсии? Я хочу заменить только внешние ключи одной строкой информации.

В настоящее время у меня есть это:

class Client(models.Model):
    my_id = models.CharField(max_length=500, unique=True)
    name = models.CharField(max_length=500)
    last_update = models.DateField(null=True, blank=True)

    friend_1  = models.ForeignKey(
        "self",
        related_name="friend_1a",
        on_delete=models.CASCADE,
        to_field="my_id",
        null=True,
        blank=True,
    )
    friend_2 = models.ForeignKey(
        "self",
        related_name="friend_2a",
        on_delete=models.CASCADE,
        to_field="my_id",
        null=True,
        blank=True,
    )
    friend_3 = models.ForeignKey(
        "self",
        related_name="friend_3a",
        on_delete=models.CASCADE,
        to_field="my_id",
        null=True,
        blank=True,
    )

    def _get_days_since_last_review(self):
        today = date.today()
        if self.last_update is None:
            self.last_update = today
        return str((today - self.last_update).days)

    days_since_last_review = property(_get_days_since_last_review)

    def __str__(self):
        return self.name


class ClientSerializer(serializers.Serializer):
    my_id = serializers.CharField(max_length=500)
    name = serializers.CharField(max_length=500)
    days_since_last_review = serializers.CharField(max_length=500)
    friend_1 = serializers.CharField()
    friend_2 = serializers.CharField()
    friend_3 = serializers.CharField()


class ClientSerializerWithFriends(serializers.ModelSerializer):
    """ this is a recursive infinite loop. TODO: Fix Me! """
    friend_1 = RecursiveField(allow_null=True)
    friend_2 = RecursiveField(allow_null=True)
    friend_3 = RecursiveField(allow_null=True)

    class Meta:
        model = Client
        fields = (
            "my_id",
            "name",
            "days_since_last_review",
            "competitor_1",
            "competitor_2",
            "competitor_3",
        )

но я не могу найти способ ограничить RecursiveField() одним уровнем глубины. В настоящее время он достигает максимальной глубины рекурсии, потому что друзья взаимны.

В основном это будет JSON:

[{
    "my_id": "LH7K_T",
    "name": "Jack",
    "last_update": "2019-06-03",
    "days_since_last_review": "9",
    "friend_1": {
        "id": 6,
        "my_id": "4YR0_T",
        "name": "Austin",
        "last_update": "2019-06-03",
        "friend_1": "LH7K_T",
        "friend_2": "M5XQ2o",
        "friend_3": null
    },
    "competitor_2": {
        "id": 8,
        "my_id": "C3ogRZ",
        "name": "Flo",
        "last_update": "2019-06-04",
        "friend_1": "LH7K_T",
        "friend_2": "0vYgr4",
        "friend_3": "M5XQ2o"
    },
    "competitor_3": {
        "id": 7,
        "my_id": "M5XQ2o",
        "name": "Charlotte",
        "last_update": "2019-06-02",
        "friend_1": "LH7K_T",
        "friend_2": null,
        "friend_3": null
    }
}]

1 Ответ

0 голосов
/ 13 июня 2019

Просто используйте depth = 1 в мета-классе сериализатора:

class ClientSerializerWithFriends(serializers.ModelSerializer):
    class Meta:
        model = Client
        fields = (
            "my_id",
            "name",
            "days_since_last_review",
            "friend_1",
            "friend_2",
            "friend_3",
        )
        depth = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...