我正在尝试在DRF中实现多个用户类型,而我正在通过拥有一个
我已经为User模型设置了身份验证和权限,现在我可以登录了。我希望登录用户能够创建他自己的个人资料(基于User模型的user_type字段)。
class User(AbstractBaseUser, PermissionsMixin):
""" A Generic User inside our system. The fields used are common to all users in system. """
....
class Customer(models.Model):
"""A Class to represent a Customer in System """
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
现在我想弄清楚如何允许用户创建与其user_type(客户/卖家)相对应的配置文件。更令人困惑的部分是如何将用户设置为我的CustomerSerializer
或SellerSerializer
的当前登录用户
这是我正在尝试使用的权限类:
class UpdateCustomerProfile(permissions.BasePermission):
"""Allow users to edit their own profile """
def has_object_permission(self, request, view, obj):
"""Check if user is trying to edit their own profile"""
return obj.user.id == request.user.id
这是客户序列化器:
class CustomerSerializer(serializers.ModelSerializer):
"""A Serizlier class for customer """
class Meta:
model = models.Customer
fields = ('user', 'first_name', 'last_name', 'dob', 'gender')
def create(self, validated_data):
"""Create and return a new customer."""
CustomerViewSet:
class CustomerViewSet(viewsets.ModelViewSet):
"""Handle creating reading and updating Users in system"""
serializer_class = serializers.CustomerSerializer
queryset = models.User.objects.filter( user_type = "CS" )
authentication_classes = (TokenAuthentication,)
permission_classes = (permissions.UpdateCustomerProfile,)
但是我收到了一个错误
尝试在序列化程序
user
上获取字段CustomerSerializer
的值时,/ api / customer-profile / GotErrorError中的AttributeError。序列化程序字段可能名称不正确,并且与User
实例上的任何属性或键都不匹配。原始异常文本是:'User'对象没有属性'user'。
我是Django的新手所以我不确定如果这是一种方法,或者我做错了什么。我怎样才能解决这个问题?遵循类似策略的任何示例项目也将非常有用。
由于您的序列化程序用于Customer
,因此您的查询集应该用于Customer
:
queryset = models.Customer.objects.filter(user=request.user)
例如,如果你只想要当前Customer
的user
个人资料。
class CustomerViewSet(viewsets.ModelViewSet):
"""Handle creating reading and updating Users in system"""
serializer_class = serializers.CustomerSerializer
#you are using customer model for serializer but for query set you are using
#User model.
queryset = models.Customer.objects.filter( user__type = "CS" )
authentication_classes = (TokenAuthentication,)
permission_classes = (permissions.UpdateCustomerProfile,)