django - 如何让用户关联到另一个模型 DRF。ValueError:精确查找的 QuerySet 值必须使用切片限制为一个结果
问题描述
我想检查卡号是否存在,然后让关联的用户使用该卡号。一个用户可以有多个卡号。如何过滤以从输入的卡号中获取用户?
楷模:
类 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
类卡模型(模型。模型):
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
序列化器:
类 CheckCard(序列化器。序列化器):
card_number = serializers.IntegerField(write_only=True)
class Meta:
fields = ['card_number','user']
read_only_fields = ['user']
意见:
类 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)
带过滤器。
推荐阅读
- getgauge - 从 jar 文件运行仪表测试
- azure-api-management - 为用户创建订阅的 Azure API 管理 REST 调用(缺失)
- ruby-on-rails - 使用 javascript 和 Rails 部分显示动态内容
- node.js - 访问 json 数据数组以存储在 mongodb 中,子文档
- rust - 是否可以从另一个成员闭包调用成员闭包?
- ios - 将 expo 应用程序版本上传到应用商店
- multithreading - 在 Windows 下从不同线程读取和写入内存映射文件的不相交部分
- python - 根据数据框中的 1 列选择具有最高值的行
- sqlite - 我需要帮助为我的课程创建一个明确的内部连接
- python - 如何构建一个 Python 比较器,以 PostgreSQL 的方式对字符串进行排序?