Ich möchte meine Besucher Funktion zum Erstellen und Liste der Vorschläge erhalten.Django Rest Framework geschachtelte Objekte erstellen mit request.user
Benutzer alle Daten außer dem Autor Vorschlag senden (weil die Auth-Benutzer selbst ist), so versuche ich, request.data mit request.user wie folgt zu erweitern:
# proposals/views.py
class ProposalsList(ListCreateAPIView):
permission_classes = (IsAuthenticatedOrReadOnly,)
queryset = Proposal.objects.all()
serializer_class = ProposalSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data={
**request.data,
"author": request.user.id,
})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Obwohl, ich möchte die Vorschläge Liste mit serialisierten Autor (Benutzer) bekommen, so meine Serializer wie folgt aussieht:
# proposals/serializers.py
class ProposalSerializer(serializers.ModelSerializer):
author = UserSerializer()
class Meta:
model = SeekerProposal
fields = ('text', 'author')
Das Problem ist, dass ich GET Benutzer korrekt Liste (serialisiert dict), aber ich kann nicht POST (Neues erstellen) Angebot, weil es t o "Autor" sei ein Diktat (es passiert, weil ich verschachtelte Serializer Autor = UserSerializer() verwende).
Fragen:
- Gibt es eine Möglichkeit Ansicht ListCreateAPIView und Autor = UserSerializer() sein zu lassen, während die Liste GET mit serialisierten Daten und erstellen Vorschlag request.user.id?
- Vielleicht gibt es eine andere Möglichkeit, autorisierten Benutzer zu Proposal Autor Feld hinzufügen?
Auch dies ist mein Modell:
# proposals/models.py
class Proposal(models.Model):
text = models.TextField(blank=False, null=False)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET(get_sentinel_user),
)
Antwort
Benutzer @zaidfazil mir mit Lösung geholfen. Ich brauchte nur noch ein zusätzliches Feld zu meinem Serializer hinzufügen Verfasser Details serialisiert gezeigt werden:
# proposals/serializers.py
class ProposalSerializer(serializers.ModelSerializer):
author_details = UserSerializer(source='author', read_only=True)
class Meta:
model = SeekerProposal
# author will be user id, and author_details will be serialized dict
fields = ('text', 'author', 'author_details')
Da author
noch id nur Benutzer und author_details
ist read_only=True
ich für Autor in GET
Anfrage alle Daten erhalten und kann einen neuen Vorschlag von author=request.user.id
erstellen.
Einen Moment:
ich nicht blank=True
auf author
Feld verwendet habe, weil ich sicher sein, dass dieses Feld nicht leer ist. So sieht meine Ansicht genauso aus wie oben geschrieben (post
auf ProposalsList
).
Nochmals vielen Dank an @zaidfazil! Wenn ich etwas falsch geschrieben habe, schreibe mir bitte, ich bin irgendwie nooby auf stackoverflow.
Irgendeine Art von Antwort wurde die Schaffung neuer Serializer ProposalNestedSerializer genannt, die meine ProposalSerializer erbt und sich author = UserSerializer(), während es von ProposalSerializer entfernen. So, jetzt benutze ich ProposalNestedSerializer für GET (und serialisierten Autor als Antwort bekommen) und mit ProposalSerializer mit POST (und kann Vorschläge nur mit request.user.id erstellen) – Dionid