在Django Rest Framework中,我有一个发布模型,该模型可以通过用户对象中的用户名和国家对象中的国家/地区名称进行过滤。它只是在API的末尾添加了?search=
。从前端开始,它使用相同的形式将此查询添加到url的末尾。我想避免混淆返回相同的国家名和用户名。例如,如果某人搜索爱尔兰,通过阻止用户使用用户名“爱尔兰”创建帐户,则只会返回与该帖子相关联的国家(爱尔兰)的“帖子”(与帖子有“多对多”关系)。
除了为每个国家/地区创建用户之外,这样的事情还有可能吗?
编辑:不尝试通过搜索更改任何内容,尝试将用户名列入黑名单。
答案 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)
您可以尝试这样:
pycountry
)来提供国家/地区。您可以使用pip install pycountry
在您的注册序列化程序中,更新如下所示的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
它将检查用户名是否实际上是一个国家名称。