Django Rest Framework - Имя пользователя поля с символом ".", "-", "_"

Я хочу разрешить из моего внутреннего API, что любой пользователь может быть создан с такими символами, как .,-,_, ñ между другими персонажами в их username поле, которое является primary_key=True,,

Я определяю свой пользовательский пользователь (AbstractBaseUser) таким образом, по отношению к username поле, которое меня интересует:

class User(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(
        _('username'),
        max_length=30,
        primary_key=True,
        unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[
            RegexValidator(
                r'^[\w.@+-]+$',
                _('Enter a valid username. This value may contain only '
                  'letters, numbers ' 'and @/./+/-/_ characters.')
            ),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    email = models.EmailField(max_length=254, unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    objects = UserManager()

мой UserSerializer это:

class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(validators=[UniqueValidator(queryset=User.objects.all(), message='Lo sentimos, existe un fichaje con este nombre de usuario')])
    email = serializers.EmailField(validators=[UniqueValidator(queryset=User.objects.all(), message='Lo sentimos, alguien ya ha sido fichado con este correo electrónico')])

    class Meta:
        model = User
        fields = ('url', 'username', 'password', 'first_name','last_name',
                  'age','other fields ...',)

Мой UserViewSet следующий:

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    filter_fields = ('username', 'is_player', 'first_name', 'last_name', 'team' , 'email', )

Маршрутизатор определяется таким образом в urls.py

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

Когда я создаю пользователя с . символ, например, как bacalao.cevichica в т. е. username поле, пользователь создан, но когда я иду в localhost:8000/api/users/

Я получаю это сообщение:

File "/home/bgarcial/.virtualenvs/fuupbol2/lib/python3.5/site-packages/django/urls/resolvers.py", line 392, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns)
django.urls.exceptions.NoReverseMatch: Reverse for 'user-detail' with arguments '()' and keyword arguments '{'pk': 'bacalao.cevichica'}' not found. 2 pattern(s) tried: ['api/users/(?P<pk>[^/.]+)\\.(?P<format>[a-z0-9]+)/?$', 'api/users/(?P<pk>[^/.]+)/$']

Я не очень знаком с регулярными выражениями, и возможно, что RegexValidator не очень хорошо сформирован?

Кроме того, возможно, что моя проблема в UserSerializer или же UserViewSet,

На данный момент я не ясно эту тему, любая направленность высоко ценится.:)

1 ответ

Решение

Если вы посмотрите на ошибку, вы заметите, что она пыталась сопоставить некоторый URL-адрес, но потерпела неудачу. Это потому что регулярное выражение по умолчанию ([^./]) исключает . а также / персонажи

Вы можете добавить lookup_value_regex в ваш ViewSet, чтобы URL знал, в каком формате должен быть ваш первичный ключ:

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    lookup_value_regex = '[\w.@+-]+'
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    filter_fields = ('username', 'is_player', 'first_name', 'last_name', 'team' , 'email', )
Другие вопросы по тегам