Как получить пользователя, связанного с другой моделью DRF. ValueError: Значение QuerySet для точного поиска должно быть ограничено одним результатом с помощью нарезки

Я хочу проверить, существует ли номер карты, а затем получить пользователя, связанного с этим номером карты. У пользователя может быть несколько номеров карт. Как отфильтровать пользователя по введенному номеру карты?

Модели:

class CustomUser(AbstractBaseUser, PermissionsMixin):

email = models.EmailField(
    verbose_name="Email Field", max_length=60, unique=True)
dateJoined = models.DateTimeField(
    verbose_name="Date Joined", auto_now_add=True)
last_login = models.DateTimeField(verbose_name="Last Login", auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_superuser = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_verified = models.BooleanField(default=False)

# Parameters that we want to know about the user
first_name = models.CharField(verbose_name="First Name", max_length=100)
last_name = models.CharField(verbose_name="Lasst Name", max_length=100)



USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']

objects = CustomUserManager()

def __str__(self):
    return self.email

def tokens(self):
    refresh = RefreshToken.for_user(self)
    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token)
    }

def has_perm(self, perm, obj=None):
    return self.is_superuser

def has_module_pers(self, app_label):
    return True

class cardModel(models.Model):

user = models.ForeignKey(CustomUser, related_name='card_numbers',null = True, blank=True, on_delete=models.CASCADE)

card_number = models.IntegerField(
    verbose_name="Card Number", blank=True, null=True, default=None, unique=True)

def __int__(self):
    return self.card_number

Serializer:

class CheckCard(serializers.Serializer):

card_number = serializers.IntegerField(write_only=True)
class Meta:
    fields = ['card_number','user']
    read_only_fields = ['user']

Просмотров:

class CheckCardAPI(APIView): permission_classes = [AllowAny]. serializer_class = CheckCard

def post(self,request,*args,**kwargs):
    serializer = self.serializer_class(data=request.data)
    card_number = request.data.get('card_number','')

    if cardModel.objects.filter(card_number=card_number).exists():
        user = User.objects.filter(card_numbers=card_number)
        tokens, created = Token.objects.get_or_create(user=user)
        return Response({'token':tokens.key},status=status.HTTP_200_OK)
    else: 
        return Response({'error':'card is not registered'},status=status.HTTP_404_NOT_FOUND)

Вы ищете одного пользователя на основе номера карты, поэтому ваш запрос

user = User.objects.filter(card_numbers=card_number)

возвращает список. Возможно, вам потребуется использовать

user = User.objects.get(card_numbers=card_number) 

получить объект или использовать

value_list(id, flat=True)

с фильтром.

Вернуться на верх