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, d, e отзывы a, b, c отзывы относятся к aaabuilding d, e отзывы относятся к aaabuilding

api/buildingdata/aaabuilding (показывает только обзор aaabuilding) api/buildingdata/xxxbuilding (показывает только обзор xxxbuilding)

>

Я искал некоторые посты о динамических url, но они не то, что мне нужно.

Есть ли способ внести название здания в url из базы данных?

В urls.py

path('api/buildingdata/<str:building>/', BuildingInfoAPI.as_view()),

И в файле views.py

class BuildingInfoAPI(APIView):
    def get(request, building):
        queryset = buildingData.objects.filter(building_name__contains=building)
        serializer = ReviewSerializer(queryset, many=True)
        return Response(serializer.data)

Надеюсь, это решит проблему

Я предлагаю вам взглянуть на документацию django, там это довольно хорошо объяснено, вот полезная ссылка

В вашем 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()),
    # added <str:building> to url
    path('api/buildingdata/<str:building>', ReviewListAPI.as_view())
]

И в вашем 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):
    # added another argument, retrieved from url
    def get(request, building):
        # changed .all() to .filter()
        queryset = reviewData.objects.filter(building_name = building)
        serializer = ReviewSerializer(queryset, many=True)
        return Response(serializer.data)
Вернуться на верх