【问题标题】:Why the url works with parameter pk and not pk2?为什么 url 使用参数 pk 而不是 pk2?
【发布时间】:2019-04-03 05:06:10
【问题描述】:

当我尝试发送pk2 或任何其他参数时,它会引发AssertionError。 我的意思是这个网址

path('grade/<str:pk>/', IndividualGrade.as_view(), name="get-grade")

不会抛出错误,而下面的会导致错误:

path('grade/<str:pk2>/', IndividualGrade.as_view(), name="get-grade")

我的看法很简单,如下:

class IndividualGrade(generics.RetrieveUpdateDestroyAPIView):
    '''    PUT/GET/DELETE grade/{grade:pk}/    '''
    queryset = Grade.objects.all()
    serializer_class = GradeSerializer
    def put(self, request, *args, **kwargs):
        try:
            g1 = Grade.objects.get(grade=kwargs["pk"])
            serializer = GradeSerializer(g1, data=request.data)
            flag = 0
        except Grade.DoesNotExist: # Create a new grade if a grade doesn't exist
            g1 = Grade.objects.get(grade=kwargs["pk"])
            serializer = GradeSerializer(g1, data=request.data)
            flag = 1
        if serializer.is_valid():
            # call update/create here
        else:
            return Response(serializer.errors)
        return Response(serializer.data, status=status.HTTP_200_OK)

如果我编写自己的 get 函数(在另一个视图中尝试),我意识到 url 中的 pk2 有效,但我不知道如何在不编写自己的 get 的情况下解决这个问题。虽然这已经讨论过here。但是我仍然不确定如何在不编写自己的 get 的情况下修复它。

【问题讨论】:

    标签: python django


    【解决方案1】:

    你需要添加

    lookup_field = 'pk2'
    

    当您使用 pk 以外的其他东西时,它是为 lookup 内置的。当您想在 url 中添加其他内容时,您需要提及。

    【讨论】:

    • 给我一个错误Cannot resolve keyword 'pk2' into field. Choices are: StudentList, id, grade
    • 好的,所以您的数据库中没有 pk2?那么你不能,因为你只能使用模型中可用的字段
    • 这是有道理的。如果有 pk2 和 pk3,我假设它的工作方式相同?我只是定义lookup_field = 'pk2'?
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多