Проблема с вложенными отношениями в Django Rest Framework - PullRequest
0 голосов
/ 03 мая 2020

Я изучаю DRF и создаю бэкэнд API для Kanban приложения. У меня есть необходимые поля, и я даже получил их там, где отношения в модели / сериализаторе дают вывод, который я вроде как хочу. Но это не совсем верно.

Вот код, который у меня пока есть.

models.py

class User(models.Model):
    username = models.CharField(max_length=100, unique=True)
    email = models.EmailField(max_length=100, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.username


class Kanban(models.Model):
    user = models.ForeignKey(User, related_name='created_boards', on_delete=models.CASCADE)
    board_name = models.CharField(max_length=100, unique=True, blank=False, null=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.board_name


class Category(models.Model):
    kanban = models.ForeignKey(Kanban, related_name='categories', on_delete=models.CASCADE)
    category_name = models.CharField(max_length=100, unique=True, blank=False, null=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.category_name


class Card(models.Model):
    category = models.ForeignKey(Category, related_name='tasks', on_delete=models.CASCADE)
    task_name = models.CharField(max_length=100, unique=True, blank=False, null=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.task_name

Serializers.py

class CardSerializer(serializers.ModelSerializer):
    class Meta:
        model = Card
        fields = ["task_name", "created_at", "updated_at"]

class CategorySerializer(serializers.ModelSerializer):
    tasks = CardSerializer(many=True)

    class Meta:
        model = Category
        fields = ['category_name', "tasks"]

class KanbanSerializer(serializers.ModelSerializer):
    categories = CategorySerializer(many=True)

    class Meta:
        model = Kanban
        fields = ["board_name", "categories"]

class UserSerializer(serializers.ModelSerializer):
    created_boards = KanbanSerializer(many=True)

    class Meta:
        model = User
        fields = ["username", "email", "created_at", "updated_at", "created_boards"]

И на мой взгляд. Я просто выкидываю все на данный момент.

class UserList(APIView):

    def get(self, request):
        user = User.objects.all()
        serializer = UserSerializer(user, many=True)
        return Response(serializer.data)

Вот вывод, который я получаю.

[
    {
        "username": "Example User",
        "email": "testing@example.com",
        "created_at": "2020-05-03T13:19:47.480690Z",
        "updated_at": "2020-05-03T13:19:47.480690Z",
        "created_boards": [
            {
                "board_name": "TestBoard",
                "categories": [
                    {
                        "category_name": "Doing",
                        "tasks": [
                            {
                                "task_name": "task test 2",
                                "created_at": "2020-05-03T13:20:36.772878Z",
                                "updated_at": "2020-05-03T13:20:36.772878Z"
                            }
                        ]
                    },
                    {
                        "category_name": "sbs",
                        "tasks": []
                    }
                ]
            },
            {
                "board_name": "Test Board 2",
                "categories": []
            }
        ]
    }
]

Вот проблема. Я хочу, например. categories объект, который будет вложен в board_name. То же самое для tasks и category_name.

Что-то вроде:

 "created_boards": {
            "TestBoard" {
                "categories": {
                    "Test cat"{
                        "tasks": []
                    }
                }
            }
        },

Я думаю, что это требует изменения отношений моделей. Но я все еще учусь, поэтому любая помощь будет оценена.

...