英文:
Get 1-4 Items via Django Rest Framework
问题
在我的Web应用中,用户可以选择比较2、3或4个数据库(Postgres)中的项目。我已经能够创建一个视图函数来查询固定数量的项目。
例如,查询3个项目
视图函数
from myapp.models import Item
@api_view(['GET'])
def get_three_items(request, pk1, pk2, pk3):
item1 = Item.objects.get(pk=pk1)
item2 = Item.objects.get(pk=pk2)
item3 = Item.objects.get(pk=pk3)
data = [item1.serialize(), item2.serialize(), item3.serialize()]
return Response(data)
urls.py
from django.urls import path
from .views import get_three_items
urlpatterns = [
path('items/<int:pk1>/<int:pk2>/<int:pk3>/', get_three_items),
# ...
]
但是在我的Web应用中,用户可以选择比较2、3或4个项目。是否有办法以动态方式编写视图函数和URL,或者我必须为每种比较能力创建一个视图?因此,一个用于比较2个项目的视图,一个用于比较3个项目的视图,以及一个用于比较4个项目的视图?
英文:
I want to create awebapp where the user can choose between comparing 2,3 or 4 items of the database (Postgres).
i already could create a view function to query a fixed amount of items.
e.g query 3 Items
View Function
from myapp.models import Item
@api_view(['GET'])
def get_three_items(request, pk1, pk2, pk3):
item1 = Item.objects.get(pk=pk1)
item2 = Item.objects.get(pk=pk2)
item3 = Item.objects.get(pk=pk3)
data = [item1.serialize(), item2.serialize(), item3.serialize()]
return Response(data)
urls.py
from django.urls import path
from .views import get_three_items
urlpatterns = [
path('items/<int:pk1>/<int:pk2>/<int:pk3>/', get_three_items),
# ...
]
But in my web app the user is able to choose between comparing 2,3 or 4 items.
Is there a way to write the View Function and URL in a way, that it is dynamic or do i have to create a view for each compare capacity. So a view to compare 2 items. A view to compare 3 items and a view to compare 4 items?
答案1
得分: 1
如果在查询参数中传递ID是一种选项,那么你可以像这样操作:
views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Item
@api_view(['GET'])
def compare_items(request):
items_ids = request.query_params.getlist('items_ids')
items = Item.objects.filter(pk__in=items_ids)
data = [item.serialize() for item in items]
return Response(data)
urls.py
from django.urls import path
from .views import compare_items
urlpatterns = [
path('items/', compare_items),
]
然后你可以像这样传递ID:
HOST/items/?items_ids=1&items_ids=3
英文:
If passing ids in Query Params is an option, then you could do something like that:
views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Item
@api_view(['GET'])
def compare_items(request):
items_ids = request.query_params.getlist('items_ids')
items = Item.objects.filter(pk__in=items_ids)
data = [item.serialize() for item in items]
return Response(data)
urls.py
from django.urls import path
from .views import compare_items
urlpatterns = [
path('items/', compare_items),
]
and then you can pass ids like that:
HOST/items/?items_ids=1&items_ids=3
答案2
得分: 1
I think i found the solution:
我认为我找到了解决方案:
I adjusted PTomasz code a little. Try this version. It worked in my case.
我稍微调整了PTomasz的代码。尝试这个版本。这在我的情况下有效。
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Item
@api_view(['GET'])
def compare_items(request):
items_ids = request.query_params.getlist('items_ids')
items = Item.objects.filter(pk__in=items_ids)
data = [serializer(item, many=False).data for item in items]
return Response(data)
英文:
I think i found the solution:
i adjusted PTomasz code a little. Try this version. It worked in my case.
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Item
@api_view(['GET'])
def compare_items(request):
items_ids = request.query_params.getlist('items_ids')
items = Item.objects.filter(pk__in=items_ids)
data = [serializer(item, many=False).data for item in items]
return Response(data)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论