Django DRF OneToOneField适用于多种用户类型

问题描述 投票:0回答:2

我正在尝试在DRF中实现多个用户类型,而我正在通过拥有一个

  1. 用户模型 - 在所有角色中都有登录相关的字段和公共字段,还有一个表示用户类型的选择字段。
  2. 客户模型 - 具有用户模型的OneToOneField。
  3. 卖方模型 - 具有用户模型的OneToOneField。

我已经为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(客户/卖家)相对应的配置文件。更令人困惑的部分是如何将用户设置为我的CustomerSerializerSellerSerializer的当前登录用户

这是我正在尝试使用的权限类:

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的新手所以我不确定如果这是一种方法,或者我做错了什么。我怎样才能解决这个问题?遵循类似策略的任何示例项目也将非常有用。

python django django-rest-framework
2个回答
2
投票

由于您的序列化程序用于Customer,因此您的查询集应该用于Customer

queryset = models.Customer.objects.filter(user=request.user)

例如,如果你只想要当前Customeruser个人资料。


0
投票
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,)
© www.soinside.com 2019 - 2024. All rights reserved.