Я изучаю 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": []
}
}
}
},
Я думаю, что это требует изменения отношений моделей. Но я все еще учусь, поэтому любая помощь будет оценена.