Я пытаюсь реализовать несколько типов пользователей в DRF, и я делаю это, имея
- Модель пользователя - которая имеет связанные с логином поля и общие поля во всех ролях, а также поле выбора, обозначающее тип пользователя.
- Модель клиента - OneToOneField с пользовательской моделью.
- Модель продавца - 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, поэтому я не уверен, если это способ сделать это или я делаю что-то не так. Как я могу это исправить? Любые примеры проектов по аналогичной стратегии также будут очень полезны.