【问题标题】:Django dynamic URL with data from DB带有数据库数据的 Django 动态 URL
【发布时间】:2021-11-15 01:22:53
【问题描述】:

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())

]

我正在制作评论 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 帖子,但它们不是我想要的。

另外,我之前发布过一个问题,但没有我想要的答案。

有什么方法可以将建筑物名称从 db 带入 URL?

【问题讨论】:

  • 尝试在 url.py 中导入建筑模型,然后尝试将该模型用作路径函数中的 URL 模式。

标签: python django url django-rest-framework url-rewriting


【解决方案1】:

请参阅path converters 上的文档。以及django的slugify function的用法。

在您的情况下,您将需要一个 slug - 但使用 slug 有一些限制:

  • slugs 必须转换为一些唯一的字符串,在您的情况下是建筑物名称。因此,您应该确保建筑物名称和 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2011-09-28
    • 2014-07-16
    • 2016-04-13
    • 2017-05-15
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多