【发布时间】:2018-08-23 16:38:54
【问题描述】:
我正在使用 Django 用户模型,并且还使用我自己的配置文件模型扩展了一些其他数据。当我想更新配置文件模型中的用户数据时,它不会更新,因为所有用户 ID、用户名、电子邮件、密码位于用户模型中,而需要更新的字段位于配置文件模型中。我使用过这种方法,它所做的只是接受输入并显示响应,但在整体查看用户数据时不显示任何更改.
models.py
class Profile(models.Model):
user = models.OneToOneField(User,related_name='profile',on_delete=models.CASCADE)
location = models.CharField(max_length=30,blank=True)
friends_count = models.PositiveIntegerField(default=0)
profile_pic = models.FileField(upload_to='profile_pics/',blank=True,null=True)
def natural_key(self):
return (self.user.username,)
views.py
class UserCreateAPIViewSet(viewsets.ModelViewSet,mixins.UpdateModelMixin):
""""A View which handles Creating and Updating User Profile"""
serializer_class = UserProfileCreateSerializer
queryset = User.objects.all()
authentication_classes = (TokenAuthentication,)
permission_classes = (permissions.UpdateOwnProfile,)
filter_backends = (filters.SearchFilter,)
search_fields = ('username','email',)
class UserUpdateAPI(generics.GenericAPIView,mixins.UpdateModelMixin):
"""Update User Profile Data"""
permission_classes = (permissions.UpdateOwnProfile,)
authentication_classes = (TokenAuthentication,)
queryset = Profile.objects.all()
serializer_class = ProfileUpdateSerializer
def put(self,request,*args,**kwargs):
return self.partial_update(request,*args,**kwargs)
urls.py
url(r'^user-update/(?P<pk>\d+)/$',views.UserUpdateAPI.as_view(),name="user-update"),
router = DefaultRouter()
router.register(r'profile',views.UserCreateAPIViewSet)
serializers.py
class UserProfileCreateSerializer(serializers.ModelSerializer):
""""A serializer for user data request"""
location = serializers.CharField(source='profile.location')
friends_count = serializers.IntegerField(source='profile.friends_count',read_only=True)
profile_pic = serializers.FileField(source='profile.profile_pic',allow_empty_file=True,allow_null=True)
class Meta:
model = User
fields = (
'pk',
'username',
'email',
'password',
'location',
'friends_count',
'profile_pic',
)
extra_kwargs = {
'password':{'write_only':True},
'friends_count':{'read_only':True},
}
def create(self, validated_data):
""""Create and return a new User"""
user = User(
email = validated_data['email'],
username = validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
class ProfileUpdateSerializer(serializers.ModelSerializer):
"""A serializer for updating user data"""
class Meta:
model = Profile
fields = ('location','profile_pic')
【问题讨论】:
-
您正在更新
Profile模型数据。不是User模型数据 -
如果您想同时更新它们,请搜索内联表单集
-
是啊!!!这取决于用户的要求,如果他想更新密码,则必须完成,如果他想编辑他的 profile_pic,则必须更新.....我将使用用户模型的视图更新问题。
-
我正在使用 android 应用程序的 rest apis 内联表单集对此有何帮助? @亚历克斯
-
在
UserProfileCreateSerializer中,您正在保存User对象,但不保存Profile对象。
标签: python django django-models django-rest-framework django-views