2015-08-05 3 views
4

Je développe une API pour une application web. Au départ, j'utilisais tastypie et je suis passé au . Drf me semble très facile. Ce que j'ai l'intention de faire est de créer un objet de profil utilisateur imbriqué. Mes modèles sont comme ci-dessousquel est le flux de contrôle du cadre de repos django

from django.db import models 
from django.contrib.auth.models import User 

class nestedmodel(models.Model): 
    info = models.CharField(null=True, blank=True, max_length=100) 


class UserProfile(models.Model): 
    add_info = models.CharField(null=True, blank=True, max_length=100) 
    user = models.OneToOneField(User) 
    nst = models.ForeignKey(nestedmodel) 

J'ai d'autres modèles qui ont ForeignKey Relation. Mes Sérialiseurs sont comme ci-dessous

from django.contrib.auth.models import User, Group 
from rest_framework import serializers 
from quickstart.models import UserProfile, nestedmodel 


class NestedSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = nestedmodel 
     fields = ('info',) 

class UserSerializer(serializers.HyperlinkedModelSerializer): 

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


class GroupSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Group 
     fields = ('url', 'name') 

class UserProfileSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer() 
    nst = NestedSerializer() 
    class Meta: 
     model = UserProfile 
     user = UserSerializer(many=True) 
     nested = NestedSerializer(many=True) 
     fields = ('nst', 'user') 

Je peux passer outre des méthodes telles que create(self, validated_data): sans aucun problème. Mais ce que je veux savoir est to which method should the response returned by create() goes, ou en d'autres termes Which method calls create(). Dans tastypie Resources.py est le fichier à remplacer pour implémenter des méthodes personnalisées. Et Resources.py contient l'ordre dans lequel les méthodes sont appelées. Quel est le fichier dans drf qui sert le même but et illustre le flux de contrôle comme Resources.py dans tastypie ?.

+0

Je ne sais pas si je comprends bien votre question, mais ne sont pas le résultat de '' create' un response' objet qui contient l'objet nouvellement créé et est généralement renvoyé à l'utilisateur? – pingul

+0

oh..oui. Je vais éditer la question. – cutteeth

Répondre

8

Ainsi, le flux passe quelque chose comme:

  1. Viewset méthode de create() qui est mis en œuvre dans CreateModelMixin
  2. Cela crée sérialiseur et valide. Une fois valide, il utilise perform_create()
  3. de viewset qui appelle la méthode de sérialiseur save()
  4. Cela à son tour appelle selon que de sérialiseur soit create() ou update() instance a été passé à sérialiseur (ce qui n'a pas été à l'étape 1)
  5. create() ou update() puis créez/instance de mise à jour qui est ensuite enregistrée sur serializer.instance
  6. Viewset retourne alors une réponse avec des données provenant de serializer.data
  7. serializer.data est en fait une propriété sur sérialiseur qui est responsable de la sérialisation de l'instance vers un dict
  8. Pour sérialiser les données, to_representation() est utilisé.
  9. réponse Puis données (Python dict) est rendu à un format de sortie via renderers qui pourrait être JSON, XML, etc

Et Resources.py contient l'ordre dans lequel les méthodes sont appelées. Quel est le fichier dans drf qui sert le même but et illustre le flux de contrôle comme Resources.py dans tastypie ?.

Supposons que ce soit une combinaison de fichiers. C'est probablement mieux de penser en termes de classes/concepts que vous touchez puisque dans DRF vous pouvez hériter de plusieurs choses pour créer vos classes. Donc, la chose qui colle tout ensemble sont viewsets. Ensuite, il existe divers mixages viewset qui collent en fait le viewset au sérialiseur et aux différentes opérations CRUD.

+0

Merci pour la réponse. Après save(), quelle méthode est appelée pour renvoyer la réponse json? Ou est-il écrit dans save() lui-même? – cutteeth

+1

mis à jour la réponse avec plus de mesures – miki725

+0

Désolé pour le retard. Le flux de contrôle dépend fortement de la classe héritée. De toute façon je ne pourrais pas trouver un moyen d'obtenir un objet s'il existe sinon en créer un nouveau. J'ai essayé de surcharger les méthodes 'save()' et 'create()' de HyperLinkedModelSerializer ainsi que Modelserializer. Quoi qu'il en soit, le contrôle n'est pas transmis aux deux méthodes. Je pense que «ce champ doit être unique» si un objet existe et que cet objet sert de champ non nullable, est généré lors de la validation. Mais il n'est toujours pas clair comment cela se fait lors de la validation puisque django génère cette erreur au moment de la création de l'objet. – cutteeth

1

J'ai trouvé moi-même la deuxième partie de la question. get/create objet peut être fait en utilisant le code personnalisé dans overriden def create(self, request, *args, **kwargs): dans views.py. Le code est comme collé ci-dessous. Encore une fois, pour plus de clarté c'est views.py pas serializers.py.En outre JSON avec les valeurs affichées sont accessibles à partir request.DATA

class NestedViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows Nested objects to be viewed or edited. 
    """ 
    queryset = nestedmodel.objects.all() 
    serializer_class = NestedSerializer 
    def create(self, request, *args, **kwargs): 
     info = request.DATA['info'] 
     user = User.objects.get(username=request.DATA['user']['username']) 
     profile = UserProfile.objects.get(user=user) 
     nst = nestedmodel.objects.create(info=info, user=user, profile=profile) 
     serialized_obj = serializers.serialize('json', [ nst, ]) 
     json_serialized = json.loads(serialized_obj) 
     data = json.dumps(json_serialized[0]) 
     return Response(data) 

Merci pour l'aide @ miki275 :)

+0

fyi. vos solutions n'utilisent pas vraiment les outils DRF comme un sérialiseur – miki725