【问题标题】:Suppressing SAVE of object in POST - Django Rest Framework在 POST 中抑制对象的保存 - Django Rest Framework
【发布时间】:2014-09-04 11:34:02
【问题描述】:

这与问题有关:Assymetric nature of GET and POST in a Django REST framework Serializer。根据 SO 指南,我将其作为一个新问题提出,而不是在该线程中提出更多问题

我正在为 User 模型编写 Viewset 和 ModelSerializer 以提供 /user 端点

GET - 以标准 DRF 方式返回所有用户的列表和信息

POST - 我希望客户端发布的只是 facebook access_token(因此已将所有其他字段作为 read_only 放入序列化程序中。ViewSet 中的 pre_save() 已连接到使用此访问令牌,它使用 django-facebook 来从 facebook api 中提取数据(使用访问令牌)并使用该信息自动创建一个新用户。由于这个新的 user 是自动创建的,我想在 POST 期间抑制正常的 DRF 流而不是创建另一个用户通过 DRF。我该怎么做?

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

【问题讨论】:

  • 好吧,我有点困惑。您正在使用 ReadOnlyModelViewSet,它是 提供默认 list()retrieve() 操作的视图集。,因此只有 GET 方法映射到它。您的 pre_save 方法究竟是如何被调用的?
  • 你是对的,它是 ModelViewSet,而不是 ReadOnlyModelViewSet - 一直在玩,看看后者是如何工作的,当我将代码复制到这个问题时忘记改回来。现在已经编辑了问题。谢谢
  • 好的,现在您只需将代码从 pre_save 放到 create 以覆盖默认行为。查看here 以查看该方法当前执行的操作并重写它以执行您想要的操作。 :)
  • 使用 create() 工作,谢谢

标签: django django-rest-framework django-facebook


【解决方案1】:

使用 ModelViewSet 的 create() 函数起作用,而不是 pre_save - 禁止保存对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多