Как я могу искать во всей моей модели Users пользователей, у которых уже есть запрашиваемый email/телефон?
Я новичок в rest framework, поэтому простите меня, если это очевидный ответ. Я использую сериализаторы с querysets в моих представлениях.
Все заблокировано с помощью JWT-аута от Firebase
Какой лучший способ поиска в моей базе данных пользователя, имеющего определенный email или телефон, и возвращения JSON-ответа True или False в зависимости от того, существует ли этот email / телефон уже в базе данных?
Что я пробовал до сих пор...
class getuserid(viewsets.ModelViewSet):
queryset = UserProfile.objects.all()
serializer_class = GetUserIdSerializer
lookup_field = 'phone'
class GetUserIdSerializer(serializers.ModelSerializer):
class Meta:
model=UserProfile
fields=['user']
Проблема с этим методом заключается в том, что если я использую JWT, который не связан с пользователем, имеющим этот номер телефона в своей модели базы данных, я получаю ошибку invalid token error/forbidden.
Очевидно, что это не очень безопасный способ сделать это, в любом случае, даже если бы rest framework позволил мне это сделать.
Вот сериализатор, в котором я создаю профиль пользователя в моей базе данных...
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model=UserProfile
fields=['company','email','name','phone','image','account_type','password','sub_user_of','sub_pending','products_read','products_write','restock_read','restock_write','expenses_read','expenses_write','banking_read','banking_write','admins']
class UserSerializer(serializers.ModelSerializer):
userprofile = UserProfileSerializer()
def update(self, instance,validated_data):
if(not instance.username == self.context['request'].user.username):
raise exceptions.PermissionDenied('You do not have permission to update')
profile_data = validated_data.pop('userprofile')
if(not hasattr(instance,'userprofile')):
instance.userprofile = UserProfile.objects.create(user=instance,**profile_data)
else:
instance.userprofile.company = profile_data["company"]
instance.userprofile.email = profile_data["email"]
instance.userprofile.name = profile_data["name"]
instance.userprofile.phone = profile_data["phone"]
instance.userprofile.account_type = profile_data["account_type"]
instance.userprofile.password = profile_data["password"]
instance.userprofile.save()
instance.first_name = validated_data.get('first_name',instance.first_name)
instance.last_name = validated_data.get('last_name',instance.last_name)
instance.email = validated_data.get('email',instance.email)
instance.save()
return instance
class Meta:
model = User
fields = ['last_name','first_name','userprofile']
Что я могу добавить к этому, чтобы выполнить поиск по всей моей модели UserProfile для пользователей, которые уже имеют указанные email и телефон?
Это оказалось намного проще, чем я думал...
Я не думал, что это позволит мне запросить всю базу данных, не уверен, почему я так думал, :)
Просто добавьте это в сериализатор...
if not profile_data["email"] == instance.userprofile.email:
email_check = UserProfile.objects.filter(email=profile_data["email"])
if email_check:
raise exceptions.PermissionDenied('Email exists')
if not profile_data["phone"] == instance.userprofile.phone:
phone_check = UserProfile.objects.filter(phone=profile_data["phone"])
if phone_check:
raise exceptions.PermissionDenied('Phone exists')