Отображение элементов модели, сгруппированных по категориям, к которым они относятся (стиль доски kanbam), с использованием Django и Vue.js
Здравствуйте, надеюсь у вас все хорошо. Я работаю над приложением для канбан-доски с Django в качестве бэкенда и Vue.js. в качестве фронтенда. У меня есть 2 модели: Status и Items. Items содержит статус как внешний ключ из модели Status.
api/models.py
from django.db import models
from django.contrib.auth.models import User
class Status(models.Model):
created_by = models.ForeignKey(User, related_name='status',
on_delete=models.CASCADE, null=True)
status = models.CharField(max_length=50, null=True)
def __str__(self):
return self.status
class Items(models.Model):
PRIORITY_CHOICES = (
("High", "danger"),
("Medium", "info"),
("Low", "primary"),
)
notes = models.CharField(max_length=255, null=True)
status = models.ForeignKey(Status, null=True, blank=True,
on_delete=models.CASCADE)
priority = models.CharField(max_length=15, null=True,choices=PRIORITY_CHOICES, default="2")
start_date = models.DateField(null=True)
end_date = models.DateField()
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, related_name='task', on_delete=models.CASCADE, null=True)
def __str__(self):
return self.notes
И я использую представления на основе классов в моем api/views.py views.py скриншот
api/serializers.py
from rest_framework import serializers
from .models import Items, Status
class ItemsSerializer(serializers.ModelSerializer):
class Meta:
model = Items
read_only_fields = (
'created_by',
'created_at',
)
fields =
('id','notes','status','priority','start_date','end_date')
class StatusSerializer(serializers.ModelSerializer):
class Meta:
model = Status
read_only_fields = (
'created_by',
)
fields = ('status','id','pk')
Проблема - я хочу отобразить элементы, созданные в моем приложении, в колонке, название которой Status.status, и под каждой колонкой я хочу отобразить все Items.notes (элементы представляют собой задачи, которые создает пользователь), которые содержат статус (Item.status), равный Status.status под этой колонкой в моем приложении vue.
На что я надеюсь: Канбабоард макет
Что я пробовал:
<template>
<div class="container">
<div class="column is-12">
<div class="buttons">
<template v-if="statusList.length === 0">
<button class="button is-primary is-light"> <router-link to="/dashboard/tasks/addStatus">Add Status</router-link></button>
</template>
<template v-else>
<button class="button is-primary is-light"> <router-link to="/dashboard/tasks/addStatus">Add Status</router-link></button>
<button class="button is-info is-light"><router-link to="/dashboard/tasks/add">Add Task</router-link></button>
</template>
</div>
</div>
<section class="section">
<div class="content">
<h4>My <code>Board</code></h4><hr>
<div class="columns">
<p v-if="tasks.length === 0">You have no boards yet.</p>
<div class="column"
v-for="status in statusList"
v-bind:key="status.id">
<div class="panel list-group">
<div class="panel-block list-group-item">
<h1 class="title">{{ status.status }}</h1>
</div>
<div class="panel-block list-group-item is-primary"
v-for="task in status.items_set.all"
v-bind:key="task.id"
>
<button class="delete"></button>
<a><h3 class="subtitle">{{task.notes}}</h3></a>
<span class="tag is-danger m-3">{{task.priority}}</span>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
import axios from 'axios'
export default {
name: 'Tasks',
data() {
return {
tasks: [],
statusList: [],
}
},
mounted() {
this.getTasks()
this.getStatus()
},
methods: {
async getTasks() {
this.$store.commit('setIsLoading', true)
axios
.get('/api/v1/tasks')
.then(response => {
this.tasks = response.data
})
.catch(error => {
console.log(error)
})
this.$store.commit('setIsLoading', false)
},
async getStatus() {
this.$store.commit('setIsLoading', true)
axios
.get('/api/v1/status')
.then(response => {
this.statusList = response.data
})
.catch(error => {
console.log(error)
})
this.$store.commit('setIsLoading', false)
}
}
}
Есть идеи о том, какую логику мне нужно реализовать, чтобы достичь этого. Любая помощь будет принята с благодарностью.
После изучения некоторых документов по DRF я нашел решение. Ответ был в моем файле serializers.py
class StatusSerializer(serializers.ModelSerializer):
#task will group task items according to the status
task = ItemsSerializer(many=True, read_only=True)
class Meta:
model = Status
read_only_fields = (
'created_by',
)
fields = ('status','id','pk','task')
И вот что я добавил для отображения в моем файле vue.js:
<div class="panel-block list-group-item is-primary"
v-for="task in status.task"
v-bind:key="task.id"
>