【问题标题】:Show specific user details in Django application instead of all details在 Django 应用程序中显示特定用户详细信息而不是所有详细信息
【发布时间】:2019-05-17 01:40:24
【问题描述】:

我正在创建我的第一个 Django 项目。我已将 30,000 个值作为输入,并希望根据主键显示特定值。

代码:

class employeesList(APIView):

def get(self,request):
    employees1 = employees.objects.all()

    with open('tracking_ids.csv') as f:
        reader = csv.reader(f)
        for row in reader:
            _, created = employees.objects.get_or_create(
            AWB=row[0],
            Pickup_Pincode=row[1],
            Drop_Pincode=row[2],
            )
    serializer = employeesSerializer(employees1 , many=True)
    return Response(serializer.data)

def post(self,request):
    # employees1 = employees.objects.get(id=request.employees.AWB)
    employees1 = employees.objects.all()
    serializer = employeesSerializer(employees1 , many=True)
    return Response(serializer.data)        

如果我在 URL 中输入 http://127.0.0.1:8000/employees/,我会得到所有值。我希望 URL 类似于 http://127.0.0.1:8000/employees/P01001168074 并显示 P01001168074 的值,其中 P01001168074 是主要 ID 。

我读过 1:showing the model values of specific user django 2)editing user details in python django rest framework 但它们是不同的

可以做到吗?如果可以,那怎么做?

【问题讨论】:

    标签: python django api django-rest-framework


    【解决方案1】:

    假设您使用的是 Django 2.0,您必须配置一个路径才能捕获您的参数as seen in the documentation

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.serializers import ModelSerializer
    
    class A(models.Model):
        x = models.CharField(max_length=250)
    
    
    class MySerializer(ModelSerializer):
        class Meta:
            model = A
            fields = ('x',)
    
    
    class MyListView(APIView):
    
        def get(self, request, *args, **kwargs):
            # simply get all the objects, serialize and return the response
            elems = A.objects.all()
            response_data = MySerializer(elems, many=True).data
            return Response(data=response_data)
    
    
    class MyDetailView(APIView):
    
        def get(self, request, *args, **kwargs):
            # we obtain the parameter from the URL
            desired_item = kwargs.get("desired_item", None)
    
            # we filter the objects by it and get our instance
            element = A.objects.filter(x=desired_item).first()
    
            # serialize the instance and return the response
            response_data = MySerializer(element).data
            return Response(data=response_data)
    
    # all we have to now is define the paths for the list and the detail views.
    urlpatterns = [
        path('employees/', MyListView.as_view()),
        path('employees/<str:desired_item>', MyDetailView.as_view())
    ]
    

    【讨论】:

    • 出现以下错误:异常类型:TypeError at /employees/P01001198206 异常值:post() 获得了意外的关键字参数“desired_item”
    • @kishankeswani 完全取决于您如何实现它。你刚才提到的对我来说相当模糊。
    • 我会调查这个错误。顺便问一个问题,为了填充这 30,000 个值,我使用了 views.py 中的 get,但 sqlite3 需要 1 小时,有更快的方法来填充这些值吗?
    • @kishankeswani 30.000 很多。对结果进行分页。
    • 谢谢,我发现了我的错误;我没有将 x 更改为主键列
    【解决方案2】:

    一个不错的选择是使用 viewset,它已经包含一个列表和详细信息端点,并且几乎不需要为默认的简单设置编写代码

    views.py

    from rest_framework import viewsets
    
    
    class EmployeeViewSet(viewsets.ModelViewSet):
        serializer_class = EmployeeSerializer
        queryset = Employee.objects.all()
    

    urls.py

    from rest_framework.routers import SimpleRouter
    from views import EmployeeViewSet
    
    
    router = SimpleRouter()
    router.register(r'employees', EmployeeViewSet, base_name='employees')
    
    urlpatterns = router.get_urls()
    

    您可以在DRF docs 中阅读有关视图集的更多信息

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多