阻止用户使用列表中的用户名创建Django帐户

时间:2018-11-29 17:27:23

标签: django django-rest-framework

在Django Rest Framework中,我有一个发布模型,该模型可以通过用户对象中的用户名和国家对象中的国家/地区名称进行过滤。它只是在API的末尾添加了?search=。从前端开始,它使用相同的形式将此查询添加到url的末尾。我想避免混淆返回相同的国家名和用户名。例如,如果某人搜索爱尔兰,通过阻止用户使用用户名“爱尔兰”创建帐户,则只会返回与该帖子相关联的国家(爱尔兰)的“帖子”(与帖子有“多对多”关系)。

除了为每个国家/地区创建用户之外,这样的事情还有可能吗?

编辑:不尝试通过搜索更改任何内容,尝试将用户名列入黑名单。

2 个答案:

答案 0 :(得分:1)

您的数据模型和工作流程尚不完全清楚,但听起来好像您可以使用Q对象检查是否可以更新API视图的查询集  (search = country或search = user)。

您可以在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'])
    )

您可以在Django Documentation for Queries中了解有关Q查询的更多信息。

答案 1 :(得分:1)

您可以尝试这样:

  1. 安装第三方库(例如pycountry)来提供国家/地区。您可以使用pip install pycountry
  2. 进行安装
  3. 在您的注册序列化程序中,更新如下所示的clean方法:

    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
    

它将检查用户名是否实际上是一个国家名称。