gpt4 book ai didi

python - Django rest framework 允许 lookup_field 有多个选项

转载 作者:行者123 更新时间:2023-11-28 17:11:50 27 4
gpt4 key购买 nike

我目前正在学习如何为我的公司构建 API。我从事这项工作的时间并不长,所以目前我基本上是一名初级开发人员。

按照一些教程,我使用基于类的 View 在非常基本的级别上启动并运行了我的 API。

我们使用硬件进行科学测量,它基于“运行”、“运行特性”和“腔室”。

对于 URL,我希望允许基于几个不同关键字的查找。因此,如果他们转到“www.example.com/api/runs_list”,API 将为登录的用户显示所有已完成的运行和腔室。

我想允许搜索特定运行或按腔室。因此,如果他们想参加 2017-11-02T18:20:24Z 开始的运行,他们可以访问“www.example.com/api/2017-11-02T18:20:24Z”并获取与运行。

或者,如果他们访问“www.example.com/api/chamber_34-A”,他们将获得该腔室迄今为止执行的所有运行。

我查看了 lookup_field 和 lookup_url_kwargs,但它似乎只允许一个选项(我现在将其设置为 chamber)。

这是我的:

网址.py

from django.conf.urls import url
from django.contrib import admin

from company.api.views import (
RunPropertiesListAPIView,
RunPropertiesDetailAPIView,
RunsDetailAPIView,
RunsListAPIView,
)

urlpatterns = [
url(r'^runs_list/$', RunsListAPIView.as_view(), name='runs_list'),
url(r'^properties_list/$', RunPropertiesListAPIView.as_view(),
name='properties_list'),
url(r'^runs_list/(?P<chamber>\d+)/$', RunsDetailAPIView.as_view(),
name='runs_list_detail'),
url(r'^properties_list/(?P<chamber>\d+)/$',
RunPropertiesDetailAPIView.as_view(), name='properties_list_detail'),
]

这里是serializers.py

from rest_framework.serializers import ModelSerializer

from company.company_import.models import (
RunProperties,
Runs,
)

class RunsSerializer(ModelSerializer):
class Meta:
model = Runs
fields = [
'id',
'chamber',
'start_time',
'end_time',
'step_time'
]

class RunPropertiesSerializer(ModelSerializer):
class Meta:
model = RunProperties
fields = [
'id',
'runs',
'property_name',
'property_value'
]

这里是views.py

from rest_framework.generics import ListAPIView, RetrieveAPIView

from company.company_import.models import (
RunProperties,
Runs,
)

from company.company_import.api.serializers import (
RunPropertiesSerializer,
RunsSerializer,
)

class RunsListAPIView(ListAPIView):
queryset = Runs.objects.all()
serializer_class = RunsSerializer

class RunPropertiesListAPIView(ListAPIView):
queryset = RunProperties.objects.all()
serializer_class = RunPropertiesSerializer

class RunsDetailAPIView(RetrieveAPIView):
queryset = Runs.objects.all()
serializer_class = RunsSerializer
lookup_field = 'chamber'
lookup_url_kwarg = 'chamber'

class RunPropertiesDetailAPIView(RetrieveAPIView):
queryset = RunProperties.objects.all()
serializer_class = RunPropertiesSerializer

我尝试过的:

在 urls.py 上

(using a | to allow two options for RegEx)(didn't seem to work)

url(r'^runs_list/(?P<chamber>\d+)|(?P<start_time>\d+)/$',
RunsDetailAPIView.as_view(),
name='runs_list_detail'),

关于 views.py

(Using python "or" to see if allowed for different options, didn't work)

class RunsDetailAPIView(RetrieveAPIView):
queryset = Runs.objects.all()
serializer_class = RunsSerializer
lookup_field = 'chamber' or 'start_time' (didn't work)
lookup_url_kwarg = 'chamber' or 'start_time' (didn't work)

(Using a list of strings to see if it allowed for different options, didn't
work)

queryset = Runs.objects.all()
serializer_class = RunsSerializer
lookups = ['chamber', 'start_time'] (didn't work)
lookup_field = lookups (didn't work)
lookup_url_kwarg = lookups (didn't work)

现在我将其默认设置为仅室,但我真的很想启用特定且多样的搜索查找。

最佳答案

与其试图找出您在 URL 本身中捕获的内容,不如 try catch 传递给 URL 的任何 kwarg,然后在您的 View 中找出如何处理它。

您的 URL 模式可能如下所示:

url(r'^runs_list/(?P<search_term>\d+)/$', 
RunsDetailAPIView.as_view(),
name='runs_list_detail'),

然后在你的 View 中解析search_term:

def get_object(self):
search_term = self.kwargs['search_term']
...

例如,您可以使用search_term 来进行一些Q 陈述:https://docs.djangoproject.com/en/1.11/topics/db/queries/#complex-lookups-with-q-objects

Runs.objects.filter(
Q(chamber = search_term) | Q(start_time = search_term)
)

根据您的用例、搜索字段和环境,您还可以考虑制作 SearchVectors:https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/#searchvector

或者您甚至可以使用 try/except block 简单地过滤您的查询集。要点是从您的 URL 中获取 kwarg 并在您的 get_object 函数中使用它,而不是试图在 URL 本身中全部弄清楚。


以上所有都适用于基础 Django;不需要 DRF。由于您使用的是 Django Rest Framework,因此您可能还对 django-filters 包感兴趣:

http://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend

关于python - Django rest framework 允许 lookup_field 有多个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47094872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com