首页 > 解决方案 > ValueError:无法分配“2”:“Model.field”必须是“Model”实例

问题描述

我有一个适用于 otp 的注册系统。我有一个自定义用户模型

class User(AbstractUser):
  password = models.CharField(max_length=128, blank=True, null=True)
  email = models.EmailField(max_length=254, unique=True)
  dial_code_id = models.CharField(max_length=100)
  mobile_number = models.CharField(max_length=100, blank=True, null=True)
  username = models.CharField(max_length=150, unique=True, blank=True, null=True)
  is_resource = models.BooleanField(default=False)
  is_customer = models.BooleanField(default=False)
  is_active = models.BooleanField(default=True)
  skills = models.ManyToManyField(Skills)

  class Meta:
      db_table = "my_user"

  def __str__(self):
      return self.mobile_number

我创建了一个“otp”模型来保存 otp。

class Otp(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE)
  otp = models.IntegerField()
  created_on = models.DateTimeField(default=django.utils.timezone.now)

  class Meta:
      db_table = "otp"

我的观点看起来像这样

class UserCreateResponseModelViewSet(viewsets.ModelViewSet):
  def create(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    if serializer.is_valid():
        serializer.save()

        custom_data = {
            "status": True,
            "message": 'Successfully registered your account.',
            "data": serializer.data
        }
        generate_otp(serializer.data['id'])
        return Response(custom_data, status=status.HTTP_201_CREATED)
    else:
        custom_data = {
            "status": False,
            "message": serializer.errors,
        }
        return Response(custom_data, status=status.HTTP_200_OK)


class UserCreateViewSet(UserCreateResponseModelViewSet):
  queryset = User.objects.all()
  serializer_class = UserSerializer

我有一个生成和保存 otp 的功能

def generate_otp(user_id):
  try:
    otp_obj = Otp.objects.get(user_id=user_id)
  except Otp.DoesNotExist:
    otp_obj = None
  if otp_obj is None:
    otp = random.randrange(1000, 9999)
    otp_obj = Otp(user=user_id, otp=otp)
    otp_obj.save()

序列化器看起来像

class UserSerializer(serializers.ModelSerializer):
  mobile_number = serializers.CharField(
    required=True,
    validators=[UniqueValidator(queryset=User.objects.all())]
  )

  class Meta:
    model = User
    fields = ['id', 'first_name', 'last_name', 'email', 'dial_code_id','mobile_number', 'is_resource', 'is_customer']

用户已成功注册,但是在将 otp 保存在“generate_otp()”中时,我收到一个错误,例如

raise ValueError(ValueError: Cannot assign "2": "Otp.user" must be a "User" instance.

我该如何克服呢?

这是正确的方法吗?

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-serializer

解决方案


看起来问题出在这里:

otp_obj = Otp(user=user_id, otp=otp)

您正在为该user字段分配一个 id (int)。不是user_id领域


推荐阅读