Django - Vue - как сгенерировать представление для тега, или?
Я использую vue и django с rest framework. В django models.py у меня есть поле модели "tahs" это charfield с тегами, разделенными запятой. пример : django,forest,native
Я хочу генерировать представление для каждого тега примера "django". ИЛИ попытаться выполнить поиск в файлах тах и вернуть объекты, содержащие этот тег[ex.django]
вот мой views.py
class TagsResultsViewSet(viewsets.ModelViewSet):
serializer_class = TagResultsViewSetSerializer
queryset = CustomUserPass.objects.all()
lookup_field = 'tahs'
def get_queryset(self, *args, **kwargs):
context = super().get_queryset(*args, **kwargs)
tag = self.kwargs['tahs']
print('this is tags:', tag)
context = self.queryset.filter(tahs__icontains=tag)
print(context)
return context
serializer.py
class TagResultsViewSetSerializer(serializers.ModelSerializer):
tahs = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = CustomUserPass
fields = '__all__'
urls.py
router = DefaultRouter()
...
router.register('tags', TagsPassViewSet, basename='tags')
router.register('tag', TagsResultsViewSet, basename='tag')
urlpatterns = [
path('', include(router.urls)),
]
vue файл: TagView.vue
<template>
<div class="about">
<h1>You looking: {{tag}}</h1>
<div v-for="result in results" :key="result.id">
<div>{{result.username}}</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'TagView',
data() {
return {
results: [],
errors: [],
}
},
props: {
tag: {
type: String,
required: true,
},
},
mounted() {
this.getTagsResults()
},
methods: {
async getTagsResults() {
this.$store.commit('setIsLoading', true)
axios
.get(`/api/v1/tag/${this.tag}`)
.then(response => {
this.results = response.data
console.log(this.results)
})
.catch(error => {
console.log(error)
})
this.$store.commit('setIsLoading', false)
},
}
}
</script>
Фактически, когда я перехожу на http://localhost:8080/tags/linux. у меня есть вывод в консоли:
this is tags: linux
<QuerySet [<CustomUserPass: drw>, <CustomUserPass: user1>]>
Not Found: /api/v1/tag/linux/
[11/Apr/2022 11:26:44] "GET /api/v1/tag/linux/ HTTP/1.1" 404 23
Когда вы переходите к api/v1/tags/linux/ DRF делает queryset.get(tahs="linux").
Это не работает с вашими данными, потому что ваше поле tahs может содержать другие слова. Поэтому вы получите ошибку 404. Вы могли бы почти исправить это, установив атрибут viewset lookup_field в tahs__icontains, однако DRF ожидает, что получит только один результат, в то время как у вас может быть несколько экземпляров CustomUserPass, которые содержат "linux". Это происходит потому, что api/v1/tags/linux рассматривается набором представлений как конечная точка детализации для одного экземпляра (которая возвращает данные для одного экземпляра), а не как конечная точка списка (которая возвращает данные для списка экземпляров)
На самом деле вы хотите добавить фильтр с помощью пакета django-filters (который также хорошо интегрируется с DRF), а затем выполнить запрос API к конечной точке списка следующим образом: api/v1/tags/?tahs=linux (или аналогично).