【发布时间】:2020-04-27 04:10:20
【问题描述】:
我目前正在使用我的第一个 Django REST Api,我对路由有疑问。
我有一个 JSON,它的简短格式如下所示:
{
"name": "Summer Festival",
"date": "2020-01-05",
"deadline": "2020-01-01",
"address": "Fantasy Road 50",
"postcode": 12346,
"location": "New York",
(...)
}
我使用这个 ViewSet:
class EventViewSet(viewsets.ModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
还有这个序列化器:
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = "__all__"
我的 urls.py:
router = routers.DefaultRouter()
router.register("events", views.EventViewSet)
urlpatterns = [
path('', include(router.urls)),
path(
'events/location=<str:address>&from=<str:from>&to=<str:to>',
views.EventViewSet.as_view({"get": "list"})),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
场景:
在我的前端有一个表单,您可以在其中选择邮政编码和日期范围。 当用户刚刚插入他的邮政编码时,他今天会获取所有事件,并且 url 应该如下所示:
http://127.0.0.1:8000/events/postcode=12345
当用户选择起始日期和邮政编码时,它应该是这样的:
http://127.0.0.1:8000/events/postcode=12345&from=2019-01-01
使用这样的日期范围 + 邮政编码:
http://127.0.0.1:8000/events/postcode=12345&from=2019-01-01&to=2019-02-01
网址应该是动态构建的。 我的 urls.py 代码 sn-p 中的第二条路径是一种解决方法,但此 url 不是动态创建的。我的第一个想法是将值设置为 null,但结果只是一个没有信息的大 url。
我已经尝试使用查找字段,但您只能将其与单个值一起使用。
是否有另一种内置的 django 或 django rest 方法来实现这个带有动态查询参数的动态 url?
【问题讨论】:
-
你看过 django-filter 吗?它将所有这些过滤选项放入查询字符串中,这很可能是它们所属的位置。尝试在 url 的相对路径中执行此操作似乎很痛苦。
-
您的过滤网址错误。它们应该是这样的:
/events/?postcode=12345(带问号!!)。这样postcode是一个查询参数,它位于request.GET中,甚至无需创建新的url。 -
不,我以前从未听说过。我虽然在 Django Rest 中有一个选项,因为路由器处理 url:django-rest-framework.org/api-guide/routers
-
@dirkgroten 啊好吧我不知道!我会检查一下,希望这可以解决我的问题。
标签: django django-rest-framework