AssertionError: `HyperlinkedIdentityField` setzt die Anfrage in der serializer-Kontext
Ich möchte erstellen Sie eine many-to-many
Beziehung, wo eine person kann in vielen vereinen und einem Verein kann beliebig viele Personen. Ich fügte hinzu, die models.py
und serializers.py
für die folgende Logik, aber wenn ich versuche, es zu serialisieren, die in der Eingabeaufforderung, bekomme ich folgende Fehlermeldung - Was mache ich hier falsch? Ich weiß nicht einmal, ein 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)
Prüfung der erstellten serializer gibt mir diese -
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)
aber serializer.data
gibt mir die Fehlermeldung
******************Bearbeiten*********************
Ich erkannte den Fehler sein könnte, weil der url
Muster, also fügte ich die folgenden url-Muster, aber ich bekomme immer noch die Fehler -
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'),
])
- Wie initiieren Sie den serializer?
- bearbeitet in der Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie diese Fehlermeldung bekommen, als die
HyperlinkedIdentityField
zu erhalten erwartetrequest
imcontext
von der serializer, so dass er bauen kann, absolute URLs. Als Sie initialisieren Ihre serializer auf der Befehlszeile, die Sie nicht haben Zugriff auf die Anfrage und so eine Fehlermeldung.Wenn Sie überprüfen müssen, um Ihr serializer auf der Kommandozeile, brauchen Sie etwas wie das hier tun:
Ihre url-Feld Aussehen würde, so etwas wie
http://testserver/person/1/
.Request
Objekt incontext
umHyperlinkedIdentityField
. Der obige Codeausschnitt erstellt ein stub-Anfrage zu erhalten, um dieses, wo man sich in der Regel nicht verfügbar.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.
, in diesem Fall, fügen Sie einfach'testserver'
zuALLOWED_HOSTS
in Ihremsettings.py
- Datei.Habe ich zwei Lösungen...
urls.py
1)
Wenn Sie einen router verwenden.registrieren Sie sich, können Sie die base_name:
2)
Wenn Sie so etwas wie dieses:
Müssen Sie pass den Kontext zu dem serializer:
views.py
Wie diesem können Sie weiterhin verwenden Sie die url auf Ihrem serializer:
serializers.py
Stieß ich auf das gleiche problem. Mein Ansatz ist, zu entfernen, 'url', von Meta.Felder in serializer.py.
Folgenden Slipstream Antwort, die ich bearbeitet meine
views.py
Einführung in den Kontext und jetzt funktioniert es.