gpt4 book ai didi

python - 断言错误 : `HyperlinkedIdentityField` requires the request in the serializer context

转载 作者:IT老高 更新时间:2023-10-28 20:43:15 38 4
gpt4 key购买 nike

我想创建一个 多对多 关系,其中一个人可以在多个俱乐部,一个俱乐部可以有很多人。我为以下逻辑添加了 models.pyserializers.py 但是当我尝试在命令提示符中对其进行序列化时,出现以下错误 - 我在做什么这里错了吗?我什至没有 HyperlinkedIdentityField

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\user\corr\lib\site-packages\rest_framework\serializers.py", line 503, in data
ret = super(Serializer, self).data
File "C:\Users\user\corr\lib\site-packages\rest_framework\serializers.py", line 239, in data
self._data = self.to_representation(self.instance)
File "C:\Users\user\corr\lib\site-packages\rest_framework\serializers.py", line 472, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "C:\Users\user\corr\lib\site-packages\rest_framework\relations.py", line 320, in to_representation"the serializer." % self.__class__.__name__
AssertionError: `HyperlinkedIdentityField` requires the request in the serializer context. Add `context={'request': request}` when instantiating the serializer.

models.py

class Club(models.Model):
club_name = models.CharField(default='',blank=False,max_length=100)

class Person(models.Model):
person_name = models.CharField(default='',blank=False,max_length=200)
clubs = models.ManyToManyField(Club)

serializers.py

class ClubSerializer(serializers.ModelSerializer):
class Meta:
model = Club
fields = ('url','id','club_name','person')

class PersonSerializer(serializers.ModelSerializer):
clubs = ClubSerializer()
class Meta:
model = Person
fields = ('url','id','person_name','clubs')

views.py

class ClubDetail(generics.ListCreateAPIView):
serializer_class = ClubSerializer

def get_queryset(self):
club = Clubs.objects.get(pk=self.kwargs.get('pk',None))
persons = Person.objects.filter(club=club)
return persons

class ClubList(generics.ListCreateAPIView):
queryset = Club.objects.all()
serializer_class = ClubSerializer


class PersonDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = PersonSerializer


def get_object(self):
person_id = self.kwargs.get('pk',None)
return Person.objects.get(pk=person_id)

检查创建的序列化程序给了我这个 -

PersonSerializer(<Person: fd>):
url = HyperlinkedIdentityField(view_name='person-detail')
id = IntegerField(label='ID', read_only=True)
person_name = CharField(max_length=200, required=False)
clubs = ClubSerializer():
url = HyperlinkedIdentityField(view_name='club-detail')
id = IntegerField(label='ID', read_only=True)
club_name = CharField(max_length=100, required=False)

但是 serializer.data 给了我错误

Edit

我意识到错误可能是由于 url 模式,所以我添加了以下 url 模式但我仍然收到错误 -

urlpatterns = format_suffix_patterns([
url(r'^$', views.api_root),
url(r'^clubs/$',
views.ClubList.as_view(),
name='club-list'),
url(r'^clubs/(?P<pk>[0-9]+)/persons/$',
views.ClubDetail.as_view(),
name='club-detail'),
url(r'^person/(?P<pk>[0-9]+)/$',
views.PersonDetail.as_view(),
name='person-detail'),
])

最佳答案

您收到此错误是因为 HyperlinkedIdentityField 期望在序列化程序的 context 中接收 request,因此它可以构建绝对 URL。当您在命令行上初始化序列化程序时,您无权访问请求,因此会收到错误。

如果您需要在命令行上检查您的序列化程序,您需要执行以下操作:

from rest_framework.request import Request
from rest_framework.test import APIRequestFactory

from .models import Person
from .serializers import PersonSerializer

factory = APIRequestFactory()
request = factory.get('/')


serializer_context = {
'request': Request(request),
}

p = Person.objects.first()
s = PersonSerializer(instance=p, context=serializer_context)

print s.data

您的 url 字段类似于 http://testserver/person/1/

关于python - 断言错误 : `HyperlinkedIdentityField` requires the request in the serializer context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34438290/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com