AssertionError: `HyperlinkedIdentityField " exige que la demande dans le contexte sérialiseur
Je veux créer un many-to-many
relation où une personne peut être dans de nombreux clubs et un club peut avoir de nombreuses personnes. J'ai ajouté le models.py
et serializers.py
pour la logique suivante mais quand j'essaie de le sérialiser dans l'invite de commande, j'obtiens l'erreur suivante - Ce que je fais mal ici? Je n'ai même pas un 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)
L'inspection de la création sérialiseur me donne ce -
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)
mais serializer.data
me donne l'erreur
******************modifier*********************
J'ai réalisé l'erreur pourrait être à cause de url
modèles, j'ai donc ajouté à l'url suivant les modèles, mais j'ai toujours l'erreur -
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'),
])
- Comment amorcer le processus?
- édité dans la question
Vous devez vous connecter pour publier un commentaire.
Vous obtenez cette erreur, comme le
HyperlinkedIdentityField
s'attend à recevoirrequest
danscontext
de la sérialiseur de sorte qu'il peut construire des Url absolues. Comme vous l'initialisation de votre sérialiseur sur la ligne de commande, vous n'avez pas accès à la demande et ainsi recevoir un message d'erreur.Si vous avez besoin de vérifier votre sérialiseur sur la ligne de commande, vous devez faire quelque chose comme ceci:
Votre champ url ressemblerait à quelque chose comme
http://testserver/person/1/
.Request
objet disponible danscontext
afin d'utiliserHyperlinkedIdentityField
. L'extrait ci-dessus crée un talon de demande pour obtenir autour de cette où l'on n'est pas normalement disponible.from rest_framework.versioning import URLPathVersioning request.version = 'v1' request.versioning_scheme = URLPathVersioning()
DisallowedHost: Invalid HTTP_HOST header: 'testserver'. You may need to add 'testserver' to ALLOWED_HOSTS.
, dans ce cas, il suffit d'ajouter'testserver'
àALLOWED_HOSTS
dans votresettings.py
fichier.J'ai deux solutions...
urls.py
1)
Si vous utilisez un routeur.l'inscription, vous pouvez ajouter le base_name:
2)
Si vous avez quelque chose comme ceci:
Vous avez à passer le contexte de la sérialiseur:
views.py
Comme cela, vous pouvez continuer à utiliser l'url sur votre sérialiseur:
serializers.py
Je suis tombé sur le même problème. Mon approche est de supprimer 'url' à partir de la Méta.champs serializer.py.
Suivant la copie de fichiers de la réponse, j'ai édité mon
views.py
présentant le contexte et maintenant ça fonctionne.