2014-07-14 3 views
2

Ceci est lié à la question: Assymetric nature of GET and POST in a Django REST framework Serializer. Je l'ai mis comme une nouvelle question, au lieu de mettre plus de questions dans ce fil, en conséquence de SO directivesSuppression de SAVE d'un objet dans POST - Django Rest Framework

Je suis en train d'écrire un Viewset et un ModelSerializer pour le modèle de l'utilisateur pour fournir un/point final utilisateur

GET - retourne la liste et les informations sur tous les utilisateurs, de la manière DRF standard

- tout ce que je veux que le client publie est le facebook access_token câblé pour utiliser ce jeton d'accès et il utilise django-facebook pour tirer des données à partir de facebook api (en utilisant jeton d'accès) et automatiquement crea te un nouvel utilisateur avec cette information. Puisque ce nouveau user est créé automatiquement, je veux supprimer le flux DRF normal pendant le POST et ne pas créer un autre utilisateur via DRF. Comment puis-je faire cela?

views.py

from open_facebook import OpenFacebook 
from django_facebook.api import FacebookUserConverter 
from django_facebook.connect import connect_user 

class UserViewSet(viewsets.ModelViewSet): 

    queryset = models.User.objects.all() 

    serializer_class = UserSerializer 

    def pre_save(self, obj): 


     access_token = obj.access_token 
     facebook = OpenFacebook(access_token) 
     conv = FacebookUserConverter(facebook) 

     action, user = connect_user(self.request, access_token) 
     # this creates an entire new row, just as required, in the variable "user", so all I want to do is suppress any other row creation in the standard POST method. connect_user fills in data like first_name, last_name, etc from facebook already, and that is exactly what I need to do. 


     conv.get_and_store_friends(user) 

     obj = user 
     user.delete() 
     # I am trying to do that by copying user to obj and deleting user, but at the end of it i 

     print obj.username 

serializers.py

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    """ 
User Serializer 
""" 

    class Meta: 
     model = models.User 
     fields = ('id', 'username', 'first_name', 'last_name', 'activities', 'image_url', 'url', 'access_token') 

     read_only_fields = ('username', 'first_name', 'last_name', 'image_url', 'activities') #todo: find out a shortcut to invert selection 

     # show activities with user details rather than separately to remove an extra server call 
     depth = 1 
+0

OK, je suis un peu confus. Vous utilisez un ReadOnlyModelViewSet, qui est _A Viewset qui fournit par défaut les actions 'list()' et 'retrieve()'. Par conséquent, seule la méthode GET est mappée dessus. Comment votre méthode pre_save est-elle appelée? – AdelaN

+0

Vous avez raison, c'est ModelViewSet, pas ReadOnlyModelViewSet - était en train de jouer et de jouer pour voir comment ce dernier fonctionne, et j'ai oublié de revenir en arrière lorsque j'ai copié le code à cette question. J'ai édité la question maintenant. Merci – dowjones123

+0

OK, maintenant tout ce que vous avez à faire est de mettre votre code de ** pre_save ** à ** créer ** afin de remplacer le comportement par défaut. Regardez [ici] (https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py) pour voir ce que la méthode fait actuellement et réécrire pour faire ce que vous voulez. :) – AdelaN

Répondre

1

en utilisant la fonction de création() de ModelViewSet travaillé, au lieu de pre_save - pour supprimer sauver l'objet

Questions connexes