Django DRF OneToOneField для нескольких типов пользователей - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь реализовать несколько типов пользователей в DRF, и я делаю это, имея

  1. Модель пользователя - которая имеет связанные с логином поля и общие поля во всех ролях, а также поле выбора, обозначающее тип пользователя.
  2. Модель клиента - OneToOneField с пользовательской моделью.
  3. Модель продавца - OneToOneField с пользовательской моделью.

Я установил аутентификацию и разрешения для модели User, и теперь я могу войти в систему. Я хочу, чтобы вошедший в систему пользователь мог создать свой соответствующий профиль (на основе поля user_type в модели User).

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,)

Но я получаю ошибку

AttributeError в / api / customer-profile / Получил AttributeError при попытке получить значение для поля user на сериализаторе CustomerSerializer. Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре User. Исходный текст исключения был: объект «Пользователь» не имеет атрибута «пользователь».

Я новичок в Django, поэтому я не уверен, если это способ сделать это или я делаю что-то не так. Как я могу это исправить? Любые примеры проектов по аналогичной стратегии также будут очень полезны.

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Поскольку ваш сериализатор предназначен для Customer, ваш набор запросов должен быть для Customer:

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

например, если вы хотите только профиль Customer текущего user.

0 голосов
/ 05 марта 2019
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,)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...