Обратные отношения в Nested serializer в каркасе отдыха django - PullRequest
0 голосов
/ 27 ноября 2018

Мой models.py выглядит следующим образом:

class Group(models.Model):
    name = models.CharField(max_length=50, unique=True)

class Policy(models.Model):
    name =  models.CharField(max_length=50, unique=True)
    source_group =  models.ForeignKey(Group, related_name='source_group')
    destination_group = models.ForeignKey(Group, related_name='destination_group')

Поскольку у меня есть два внешних ключа, указывающих на одну и ту же модель, я использую связанное имя, чтобы избежать конфликтов.

Сейчас, когда я пытаюсь создать сериализатор для групп, чтобы вывести список всех политик, связанных с ним, я делаю следующее:

class PolicySerializer(serializers.ModelSerializers):
    class Meta:
         model = Policy
         fields = "__all__"

class GroupSerializer(serializers.ModelSerializer):
    policy = PolicySnippetSerializer(source ='source_group', many=True)

    class Meta:
        model = Group
        fields = ['id', 'name', 'policy']

Однако, это даст мне только политики для source_group. Как я могу получитьвсе группы, связанные с группой, источником и местом назначения?

1 Ответ

0 голосов
/ 27 ноября 2018

Это можно сделать двумя способами.

  1. Использование SerializerMethodField.
  2. Переопределив метод свойства data и добавив данные destination_group в ключ policy.

Метод 1 :

class GroupSerializer(serializers.ModelSerializer):
    policy = serializers.SerializerMethodField()

    def get_policy(self, obj):
        source_groups = PolicySnippetSerializer(obj.source_group.all(), many=True).data
        destination_groups = PolicySnippetSerializer(obj.destination_group.all(), many=True).data

        return source_groups + destination_groups
# rest of the code

Метод 2 :

class GroupSerializer(serializers.ModelSerializer):
    policy = PolicySnippetSerializer(source ='source_group', many=True)

    @property
    def data(self):
        serializer_data = super().data()
        serializer_data['policy'] += PolicySnippetSerializer(self.instance.destination_group.all(), many=True).data

        return serializer_data

# rest of the code
...