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