Django динамический URL с данными из БД
Models.py
from django.db import models
# Create your models here.
class reviewData(models.Model):
building_name = models.CharField(max_length=50)
review_content = models.TextField()
star_num = models.FloatField()
class buildingData(models.Model):
building_name = models.CharField(max_length=50)
building_loc = models.CharField(max_length=50)
building_call = models.CharField(max_length=20)
views.py
# Create your views here.
from django.shortcuts import render
from rest_framework.response import Response
from .models import reviewData
from .models import buildingData
from rest_framework.views import APIView
from .serializers import ReviewSerializer
class BuildingInfoAPI(APIView):
def get(request):
queryset = buildingData.objects.all()
serializer = ReviewSerializer(queryset, many=True)
return Response(serializer.data)
class ReviewListAPI(APIView):
def get(request):
queryset = reviewData.objects.all()
serializer = ReviewSerializer(queryset, many=True)
return Response(serializer.data)
urls.py
from django.contrib import admin
from django.urls import path
from crawling_data.views import ReviewListAPI
from crawling_data.views import BuildingInfoAPI
urlpatterns = [
path('admin/', admin.site.urls),
path('api/buildingdata/', BuildingInfoAPI.as_view()),
#path('api/buildingdata/(I want to put building name here)', ReviewListAPI.as_view())
]
Я делаю review api.
Я хочу использовать название здания в качестве пути url, чтобы вывести отзывы для определенных зданий
Например, есть отзывы a, b, c
a, b отзывы предназначены для aaabuilding
c отзывы для xxxbuilding
api/buildingdata/aaabuilding (показывает только обзор aaabuilding)
{
building_name = aaabuilding
review_content = a
star_num = 5
building_name = aaabuilding
review_content = b
star_num = 3
}
api/buildingdata/xxxbuilding (показывает только обзор xxxbuilding)
{
building_name = xxxbuilding
review_content = c
star_num = 4
}
Я искал несколько постов с динамическими URL, но они были не такими, как мне нужно.
Кроме того, я уже задавал вопрос, но ответа на него не было.
Есть ли способ принести название здания в URL из базы данных?
Обратитесь к документации по преобразователям путей. И использование функции django slugify.
В вашей ситуации вам нужен slug - но есть ограничения на использование slug:
- slug должен преобразовываться в некоторую уникальную строку, в вашем случае в название здания. Поэтому вы должны убедиться, что название здания и slug уникальны в вашей модели.
Вам следует добавить поле slug в модель - а также изменить модель обзора так, чтобы она имела внешние ключи к модели здания:
from django.utils.text import slugify
class buildingData(models.Model):
building_name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(unique=True)
building_loc = models.CharField(max_length=50)
building_call = models.CharField(max_length=20)
def save(self, *args, **kwargs):
self.slug = slugify(self.building_name)
return super().save(*args, **kwargs)
class reviewData(models.Model):
building = models.ForeignKey(buildingData, related_name='reviews', on_delete=models.CASCADE, null=False, blank=False)
review_content = models.TextField()
star_num = models.FloatField()
Тогда в вашем urls.py
:
path('api/buildingdata/<slug:slug>/', ReviewListAPI.as_view())
Тогда в вашем Views.py
:
class ReviewListAPI(APIView):
def get(self, request):
building = get_object_or_404(buildingData, slug=self.kwargs.get('slug')
queryset = building.reviews.all()
serializer = ReviewSerializer(queryset, many=True)
return Response(serializer.data)
Также пересмотрите pep8 - ваши имена классов действительно должны быть BuildingData и ReviewData - и вам, вероятно, не нужно Data
в именах.