【问题标题】:Django Rest Framework - AssertionError Fix your URL conf, or set the `.lookup_field` attribute on the view correctlyDjango Rest Framework - AssertionError 修复您的 URL conf,或正确设置视图上的 `.lookup_field` 属性
【发布时间】:2017-10-07 03:06:18
【问题描述】:

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

http://website/organisation 而不是 http://website/organisation/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)

相关网址: 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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    对于详细视图,您需要覆盖 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
    

    【讨论】:

    • 谁能解释一下这条线是做什么的? queryset = self.filter_queryset(self.get_queryset())
    • 此答案适用于仅返回一个对象的海报用例。它不适用于返回多个对象的用例。您需要提出一个单独的问题并在那里详细说明您的问题。
    【解决方案2】:

    如果您使用的是 mixins,请将 lookup_field 更改为正确的

    class OrganisationDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin,generics.GenericAPIView):
    
        serializer_class = OrganisationDetailSerializer
        lookup_field = 'members' 
    
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def patch(self, request, *args, **kwargs):
            return self.partial_update(request, *args, **kwargs)
    

    【讨论】:

      【解决方案3】:

      我的解决方案是更改一个参数,它有 id,而不是应该只显示一个元素的路径中的 pk,当将其更改为 时,它的效果非常好

      from the django.urls import path
      from rest_framework.urlpatterns import format_suffix_patterns
      from posts import views
      
      
      urlpatterns = [
          path ('posts /', views.PublicationList.as_view ()),
          path ('posts / <int: id> /', views.Publication_detail.as_vi`enter code here`ew ()),
      ]
      
      urlpatterns = format_suffix_patterns (urlpatterns)
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2019-09-14
      相关资源
      最近更新 更多