首页 > 解决方案 > 如何从 url 获取可选参数并使用它们来解析模型中的对象?

问题描述

例如,从 url:https://localhost:8000/parameters=param1¶m2¶m3

如何将参数解析为列表并将其传递到基于类的视图中?

网址.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('parameters=...', MyListView.as_view()),
]

视图.py

class MyListView(generics.ListAPIView):
    queryset = MyObject.objects.all() # Use the parameters to filter out objects
    serializer_class = MyObjectSerializer

模型.py

class MyObject(models.Model):
    object_id = models.CharField(max_length=10)
    content = models.CharField(max_length=120)


# Each object can have an unlimited number of parameters
class ObjectParameters(models.Model):
    my_object = models.ForeignKey(MyObject, on_delete=models.CASCADE)
    param = models.CharField(max_length=120)

我想查询包含所有给定参数的对象列表。另外,这是我的模型的逻辑结构吗?

标签: pythondjango

解决方案


最初,您不需要做任何事情来处理函数中的查询参数--(Wiki)path(...)

因此,将您的 urls.py 更改为

urlpatterns = [
    path('admin/', admin.site.urls),
    path('some/path/', MyListView.as_view()),
]

get_queryset(...)然后,在您看来,将该方法重写为

class MyListView(generics.ListAPIView):
    serializer_class = MyObjectSerializer

    def get_queryset(self):
        queryset = MyObject.objects.all()
        param = self.request.query_params.get("parameter_name")
        if param:
            queryset = queryset.filter(some_model_field=param)
        return queryset

所以,现在,DRF 视图期望表单中的查询参数,

https://localhost:8000/some/path/?parameter_name=foo&parameter_name=bar

我强烈建议django-filter为此使用成熟的软件包


推荐阅读