Django Rest Framework - AssertionError修复您的URL conf,或者在视图上正确设置`.lookup_field`属性

And*_*ewO 5 python django django-rest-framework

我试图返回特定于用户的单个对象(不是查询集)而不必在请求的URL中指定标识符/ pk.每个用户都有一个组织FK.

http://网站/组织,而不是http:// website/organization/1

我收到以下错误,因为它期望这个标识符: AssertionError: Expected view OrganisationDetail to be called with a URL keyword argument named "user__organisation_id". Fix your URL conf, or set the.lookup_fieldattribute on the view correctly.

在使用RetrieveModelMixin/GenericAPIView时,如何/我需要指定它返回由FK链接的单个对象?

我的观点类:

class OrganisationDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin,generics.GenericAPIView):
    serializer_class = OrganisationDetailSerializer
    lookup_field = 'pk' #yes, I know this is the default and there's no need to speciy

    def get_queryset(self):
        return Organisation.objects.filter(pk=self.request.user.organisation_id)

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

相关网址: url(r'^api/v1/organisation/$', OrganisationDetail.as_view()),

我的模特:

class Person(AbstractUser):
    organisation = models.ForeignKey(Organisation, related_name='members', null=True)
    is_admin = models.BooleanField(default=False)
    def __str__(self):
        return self.first_name + " " + self.last_name + " - " + self.email
Run Code Online (Sandbox Code Playgroud)

mun*_*nsu 16

您需要覆盖get_object(),而不是覆盖get_queryset()详细视图.您仍然需要权限检查,因此我建议您浏览源代码.首先删除你的get_queryset()方法然后尝试这个为初学者:

# inside OrganisationDetail
queryset = Organisation.objects.all()

def get_object(self):
    queryset = self.filter_queryset(self.get_queryset())
    # make sure to catch 404's below
    obj = queryset.get(pk=self.request.user.organisation_id)
    self.check_object_permissions(self.request, obj)
    return obj
Run Code Online (Sandbox Code Playgroud)

  • 这个答案适用于海报的用例,即仅返回一个对象。它不适用于返回多个对象的用例。您需要提出一个单独的问题并详细说明您的问题。 (2认同)