我想建立一种many-to-many
关系,一个人可以在许多俱乐部,一个俱乐部可以有许多人。我为下面的逻辑添加了models.py
和serializers.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
给了我错误
**************编辑*********************
我意识到错误可能是由于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'),
])
我遇到了同样的问题。我的方法是从serializer.py中的Meta.fields中删除“url”。
我有两个解决方案。。。
url.py
1) 如果使用的是router.register,则可以添加基本名称:
2) 如果你有这样的东西:
必须将上下文传递给序列化程序:
视图.py
这样,您可以继续在序列化程序上使用url: serializers.py
由于序列化程序的
context
中的request
预期会接收到HyperlinkedIdentityField
,因此它可以生成绝对url,因此会出现此错误。在命令行上初始化序列化程序时,您无权访问请求,因此收到错误。如果需要在命令行上检查序列化程序,则需要执行以下操作:
你的url字段看起来像
http://testserver/person/1/
。相关问题 更多 >
编程相关推荐