Ich entdeckte vor kurzem DRF und ich bin verloren mit der Anzahl der Ansichten, Ansichten und anderen Möglichkeiten.Django Rest Framework erweitert Benutzerprofil
Ich habe eine Python3/Django 1.8-Anwendung mit einem erweiterten Benutzerprofil:
from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
class Profile(models.Model):
GENDER = (
('male', _('MALE')),
('female', _('FEMALE')),
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.CharField(default='', max_length=500, null=True, blank=True)
gender = models.CharField(max_length=10, choices=GENDER, null=True, blank=True)
city = models.CharField(default='', max_length=30, null=True, blank=True)
country = models.CharField(default='', max_length=30, null=True, blank=True)
Ich möchte externe mobile Anwendungen mit oauth2/Token Bearer zu erhalten den aktuellen angeschlossenen Benutzer-Profile durch das verbunden ermöglichen api und der Bearbeitung diese Routen mit:
GET oder PUT/api/profile GET oder PUT/api/user
Meine erste Absicht war, nur eine Route zu benutzen, um beide Modelle zu manipulieren (durch/api/profile), aber ich scheiterte und ich bin nicht sicher, ob es eine gute Übung ist, zwei Modelle hinter einer Route zu mischen.
Ich habe viele Dinge ausprobiert. Mein letzter Versuch war das Profil wie folgt zu erhalten:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'password', 'email', 'groups')
password = serializers.CharField(write_only=True)
class UserViewSet(viewsets.ModelViewSet):
@list_route(methods=['get', 'post'], permission_classes=[permissions.IsAuthenticated])
def profile(self, request):
u = User.objects.filter(pk=request.user.pk)[0]
p = Profile.objects.filter(user=u)[0]
return Response({"id": u.id, "first_name": u.first_name, "last_name": u.last_name, "email": u.email,
"city": p.city, "country": p.country, "bio": p.bio})
permission_classes = [permissions.IsAuthenticated]
queryset = User.objects.all()
serializer_class = UserSerializer
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
Problem ist: Ich schlug fehl versuchen, die gleiche Sache für PUT-Anfragen zu implementieren. Außerdem würde ich gerne den Code für die Sicherheit und Verteidigung auf der API-Seite machen und in dieser Situation benutze ich nicht einmal die Serialisierer.
Könnt ihr mir helfen, das Richtige zu finden? Hast du Tipps, Anregungen?
Prost
Worin bestand das Problem, wenn Sie einen Ansichtssatz für das Profil erstellten? – ilse2005
Swagger zeigte keine Formularfelder an, weil ich nicht gefunden habe, wie man den Serializer manuell benutzt, und ich musste die Benutzerdaten manuell überprüfen. Ich möchte die Sicherheitsprüfungen an den Serializer delegieren. –