Django Rest Framework получить дерево родителей и потомков объекта - PullRequest
0 голосов
/ 26 мая 2020

Я бы облегчил получение полного дерева объектов для данного объекта.

Допустим, у меня есть:

Note 5
Note 1
    Note 2
        Note 3
            Note 4
Note 6
Note 7

Я попытался использовать модель для получения детей и родителей и объедините это вместе. Затем я нашел какое-то решение с использованием сериализаторов, но когда я возвращаюсь, я всегда получаю все заметки. Я хотел бы получить только дерево заметок.

Мой текущий код:

# models.py
class Note(models.Model):
    note_id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=100)
    parent_note = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, related_name='subnotes')
# serializers.py
class RecursiveSerializer(serializers.Serializer):
    def to_representation(self, value):
        serializer = self.parent.parent.__class__(value, context=self.context)
        return serializer.data


class NoteTreeSerializer(serializers.ModelSerializer):
    subnotes = RecursiveSerializer(many=True, read_only=True)

    class Meta:
        model = Note
        fields = ('note_id', 'title', 'subnotes')
# views.py
class NoteTreeViewSet(viewsets.ModelViewSet):

    queryset = Note.objects.all()

    serializer_class = NoteTreeSerializer

    def retrieve(self, request, pk, *args, **kwargs):
        queryset = Note.objects.filter(pk=pk)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

Для http://127.0.0.1: 8000 / api / note / 3 / note-tree / Я бы хотел получить:

    {
        "note_id": 1,
        "title": "Note 1",
        "subnotes": [
            {
                "note_id": 2,
                "title": "Note 2",
                "subnotes": [
                    {
                        "note_id": 3,
                        "title": "Note 3",
                        "subnotes": [
                            {
                                "note_id": 4,
                                "title": "Note 4",
                                "subnotes": []
                            }
                        ]
                    }
                ]
            }
        ]
    },

Итак, для нот 1, 2, 3, 4 результат должен быть одинаковым, для 5, 6, 7 он должен быть другим.

...