/ / Django Rest Framework, Modell-Serializer, arbeitet mit schreibgeschützten Daten - Django, Django-Rest-Framework

Django Rest Framework, Modell-Serializer, arbeitet mit schreibgeschützten Daten - Django, Django-Rest-Framework

Ich habe einen Endpunkt wie diesen: "host.com/questions/123/vote". Das Front-End kann eine Post-Anfrage mit dem Abstimmtyp "oben" oder "unten" an diesen Endpunkt senden. Im Backend ist die Abstimmung wie folgt:

class Vote(models.Model):
UP = "UP"
DOWN = "DOWN"
CHOICE = ((UP, "upvote"), (DOWN, "downvote"))
post_content_type = models.ForeignKey(ContentType,
on_delete=models.CASCADE)
post_id = models.PositiveIntegerField()
post = GenericForeignKey("post_content_type", "post_id")
voter = models.ForeignKey(to=settings.AUTH_USER_MODEL,
related_name="votes")
type = models.CharField(choices=CHOICE, max_length=8)

class Meta:
unique_together = ("post_content_type", "post_id", "voter")

Ich verwende generisches fk, weil Sie neben Frage auch für eine andere Modellinstanz stimmen können.

und jetzt erstelle ich diesen API-Endpunkt mit CreateAPIView von DRF.

hier ist meine frage:

Wie übergebe ich die Daten aus beiden Quellen: die request.data (wo der Abstimmtyp ist) und die kwargs (wo die Fragen-ID und der Inhaltstyp "Frage").

Ich habe versucht:

  1. Übergeben Sie kwargs an self.get_serializer_context und rufen Sie es über SerializerMethodField ab. Es hat nicht funktioniert
  2. Übergeben Sie kwrags direkt an perform_create, aber dies besteht die Validierung auf der DRF-Seite.

Antworten:

0 für die Antwort № 1

Sie müssen einige write_only-Felder für post_content_type und post_id angeben.

class VoteSerializer(serializers.Serializer):
post_content_type_id = serializers.PrimaryKeyRelatedField(write_only=True)
post_id = serializers.IntegerField(write_only=True)
type = serializers.CharField()
## your other fields ...

Wenn Sie neugierig sind, wie verschiedene Darstellungen für die generische Beziehung ausgegeben werden sollen, lesen Sie diesen Abschnitt der DRF-Dokumentation: http://www.django-rest-framework.org/api-guide/relations/#generic-relationships.


0 für die Antwort № 2

Am Ende überschreibe ich die to_internal Funktion im Serializer und übergeben Sie die URL-Daten durch Überschreiben get_serializer_context in dem CreateAPIView und holen Sie sich die Daten mit self.context in dem to_internal Funktion