这与以下问题有关:Django REST 框架序列化器中 GET 和 POST 的不对称性质。根据SO指南,我将其作为一个新问题提出,而不是在该线程中提出更多问题
我正在为 User 模型编写 Viewset 和 ModelSerializer 以提供 /user 端点
GET
- 以标准 DRF 方式返回所有用户的列表和信息
POST
- 我希望客户端发布的只是 facebook access_token (因此已将所有其他字段作为 read_only 放在序列化程序中。ViewSet 中的 pre_save() 连接到使用此访问令牌,它用于django-facebook
从 facebook api 提取数据(使用访问令牌) 并使用该信息自动创建一个新用户。由于这个新用户user
是自动创建的,我想在 POST 期间抑制正常的 DRF 流,而不是通过 DRF 创建另一个用户。我该怎么做?
视图.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
序列化程序.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