2016-04-08 24 views
3

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

+0

Worin bestand das Problem, wenn Sie einen Ansichtssatz für das Profil erstellten? – ilse2005

+0

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. –

Antwort

2

Ich denke, das ist das, was Sie wollen:

class ProfileSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Profile 
     fields = ('bio', 'gender', 'city', 'country') 


class UserSerializer(serializers.ModelSerializer): 

    profile = ProfileSerializer() 

    class Meta: 
     model = User 
     fields = ('url', 'username', 'password', 'email', 'groups', 'profile') 

Oder wenn Sie es flach wollen:

class UserSerializer(serializers.ModelSerializer): 

    bio = serializers.CharField(source='profile.bio') 
    gender = serializers.CharField(source='profile.gender') 
    #same for the others 

    class Meta: 
     model = User 
     fields = ('url', 'username', 'password', 'email', 'groups', 'bio', 'gender') 

ich es nicht getestet, sollte aber zu nah was du willst, oder zumindest nahestehen.

+0

Es ist in der Tat in der Tat danke! Aber ich möchte nur GET und PUT Anfrage autorisieren und den aktuellen Benutzer automatisch auswählen. POST/Benutzer/Profil (das aktuelle Benutzerprofilmodell ändern) GET/user/profile (modifizieren des aktuellen Benutzermodells) –

Verwandte Themen