Запретить пользователям создавать учетную запись Django с именем пользователя в списке - PullRequest
0 голосов
/ 29 ноября 2018

В Django Rest Framework у меня есть модель поста, которая может быть отфильтрована как по именам пользователей из моего пользовательского объекта, так и по названиям стран из объектов страны.Он просто добавляет ?search= в конец API.Начиная с внешнего интерфейса, он использует ту же форму, чтобы добавить этот запрос в конец URL.Я бы хотел избежать путаницы при возврате одинаковых имен стран и пользователей.Например, если кто-то искал Ирландию, запретив пользователям создавать учетную запись с именем пользователя Ирландия, он будет возвращать только посты со страной Ирландия, связанной с постом (отношение ManyToMany к постам).

Возможно ли что-нибудь подобное за пределами создания пользователя для каждой страны?

edit: Не пытаться что-либо изменить с помощью поиска, пытаясь занести в черный список имена пользователей.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы можете попробовать вот так:

  1. Установите стороннюю библиотеку, например pycountry, которая предоставляет страны.Вы можете установить его, используя pip install pycountry
  2. В регистраторе сериализации обновите метод очистки следующим образом:

    import pycountry
    
    class Register(serializer.ModelSerializer):
        ....
    
        def validate_username(self, value):
            country = filter(lambda x: x.name.lower() == value.lower(), pycountry.countries)
            if len(list(country)) > 0:
                raise serializers.ValidationError("Invalid username")
            return value
    

Он проверит, если имя пользователяна самом деле название страны.

0 голосов
/ 29 ноября 2018

Ваша модель данных и рабочий процесс не совсем понятны из вашего вопроса, но, похоже, вы могли бы обновить набор запросов своего API View с помощью объекта Q, проверяющего, если (search = country OR search = user).

Youможете сделать это в вашем API. Вот так:

import from django.db.models import Q

class PostList(generics.ListAPIView):

  def get_queryset(self):
    return Post.objects.filter(
      Q(user__username=self.kwargs['search']) | \
      Q(country__name=self.kwargs['search'])
    )

Подробнее о Q-запросах можно прочитать в Документация Django для запросов .

...