简体   繁体   English

Django AttributeError: 'collections.OrderedDict' 对象没有属性 'pk'

[英]Django AttributeError: 'collections.OrderedDict' object has no attribute 'pk'

When I try to add an url attribute to my model I get this error:当我尝试向模型添加 url 属性时,出现此错误:

AttributeError: 'collections.OrderedDict' object has no attribute 'pk'

These are the codes I use.这些是我使用的代码。 I tried a lot of things but just get an error with everything I try..我尝试了很多东西,但我尝试的一切都出错了..

Serializer:序列化器:

class GroupPatchSerializer(serializers.ModelSerializer):
    linked_sites = serializers.ListField()
    name = serializers.CharField(required=False)
    url = serializers.HyperlinkedIdentityField(
        view_name="group-detail", lookup_url_kwarg="group_pk"
    )

    class Meta:
        model = Group
        fields = ("id", "url", "name", "linked_sites")

    def validate_linked_sites(self, sites):
        ** code **
        return sites

    # noinspection PyMethodMayBeStatic
    def validate_name(self, name):
        ** code **
        return name

view:看法:

def patch(self, request, group_pk):
    """
    Add site to group, change an existing group's name.

        -id: The group's id
    """
    user = request.user
    group_id = int(group_pk)
    group = Group.objects.filter(pk=group_id).first()

    # Update the group
    serializer_class = self.get_serializer_class()
    serializer = serializer_class(
        data=self.request.data,
        context={"request": request, "user_pk": user.id, "group_id": group_id},
    )

test-class:测试类:

def test_ok_authorized_access(self):
    # Login the user
    self.client.force_login(self.user_1)
    UserSiteFactory(user=self.user_1, site=self.test_site_3)

    # Get the url
    url = reverse("group-detail", kwargs={"group_pk": self.test_group_1.pk})

    # New group name
    new_name = "New group name"

    sites = [self.test_site_3.pk]

    # Execute the patch operation
    response = self.client.patch(
        url, data={"name": new_name, "linked_sites": sites}
    )

    # Test if there was no error
    self.assertEqual(response.status_code, status.HTTP_200_OK)

    # Test if the group was renamed
    group = Group.objects.all().filter(pk=self.test_group_1.pk).first()
    self.assertEqual(group.name, new_name)

stacktrace堆栈跟踪

Traceback (most recent call last):
  File "/opt/project/backend/groups/tests/test_group_patch.py", line 45, in test_ok_authorized_access
    url, data={"name": new_name, "linked_sites": sites}
  File "/usr/local/lib/python3.6/site-packages/rest_framework/test.py", line 310, in patch
    path, data=data, format=format, content_type=content_type, **extra)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/test.py", line 215, in patch
    return self.generic('PATCH', path, data, content_type, **extra)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/test.py", line 232, in generic
    method, path, data, content_type, secure, **extra)
  File "/usr/local/lib/python3.6/site-packages/django/test/client.py", line 422, in generic
    return self.request(**r)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/test.py", line 283, in request
    return super().request(**kwargs)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/test.py", line 235, in request
    request = super().request(**kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/test/client.py", line 503, in request
    raise exc_value
  File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/viewsets.py", line 114, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "/opt/project/backend/groups/views/group_detail_view.py", line 108, in patch
    return Response(serializer.data, status=status.HTTP_200_OK)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 559, in data
    ret = super().data
  File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 263, in data
    self._data = self.to_representation(self.validated_data)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 526, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/relations.py", line 393, in to_representation
    url = self.get_url(value, self.view_name, request, format)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/relations.py", line 329, in get_url
    lookup_value = getattr(obj, self.lookup_field)
AttributeError: 'collections.OrderedDict' object has no attribute 'pk'

From the DRF docs on HyperlinkedIdentityField :来自HyperlinkedIdentityField 上的 DRF 文档

lookup_field - The field on the target that should be used for the lookup. lookup_field - 目标上应该用于查找的字段。 Should correspond to a URL keyword argument on the referenced view.应对应于引用视图上的 URL 关键字参数。 Default is 'pk'.默认值为“pk”。

lookup_url_kwarg - The name of the keyword argument defined in the URL conf that corresponds to the lookup field. lookup_url_kwarg - 在 URL conf 中定义的与查找字段相对应的关键字参数的名称。 Defaults to using the same value as lookup_field .默认使用与lookup_field相同的值。

So you're setting lookup_url_kwarg directly, but you're not changing lookup_field , which is where your error is coming from.所以你直接设置lookup_url_kwarg ,但你没有改变lookup_field ,这是你的错误的来源。 Because lookup_url_kwarg defaults to the same value as lookup_field , we can just use that:因为lookup_url_kwarg默认值与lookup_field相同,所以我们可以使用它:

class GroupPatchSerializer(serializers.ModelSerializer):
    # code...
    url = serializers.HyperlinkedIdentityField(
        view_name="group-detail", lookup_field="group_pk"
    )
    # code...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 'collections.OrderedDict' 对象没有属性 'pk' - django rest 框架 - 'collections.OrderedDict' object has no attribute 'pk' - django rest framework Django - AttributeError: 'collections.OrderedDict' 对象没有属性 'id' - Django - AttributeError: 'collections.OrderedDict' object has no attribute 'id' AttributeError: 'collections.OrderedDict' object 没有属性 'train' - AttributeError: 'collections.OrderedDict' object has no attribute 'train' AttributeError: 'collections.OrderedDict' 对象没有属性 'split' - AttributeError: 'collections.OrderedDict' object has no attribute 'split' AttributeError: 'collections.OrderedDict' 对象没有属性 'iloc' - AttributeError: 'collections.OrderedDict' object has no attribute 'iloc' AttributeError: 'collections.OrderedDict' object 没有属性 'size' - AttributeError: 'collections.OrderedDict' object has no attribute 'size' AttributeError: 'collections.OrderedDict' object 没有属性 'value_counts' - AttributeError: 'collections.OrderedDict' object has no attribute 'value_counts' AttributeError: 'collections.OrderedDict' object 没有属性 'modules' - AttributeError: 'collections.OrderedDict' object has no attribute 'modules' Django - 'collections.OrderedDict' 对象没有属性 'headers' - Django - 'collections.OrderedDict' object has no attribute 'headers' “collections.OrderedDict”对象没有属性 - 'collections.OrderedDict' object has no attribute
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM