首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError:无法赋值"{'interests':['Technology','Sports','Health'] "Consumer.interests“必须是”Interest“实例

ValueError:无法赋值"{'interests':['Technology','Sports','Health'] "Consumer.interests“必须是”Interest“实例
EN

Stack Overflow用户
提问于 2021-06-10 00:02:50
回答 1查看 33关注 0票数 0

这是一个Django + API应用程序,其中Django是ReactJS后端,ReactJS是前端。

在注册表单中,当用户尝试注册帐户时,它会返回一个错误

代码语言:javascript
复制
ValueError: Cannot assign "['Sports', 'Health']": "Consumer.interests" must be a "Interests" instance.

不幸的是,SOF的答案并没有帮助解决这个问题,所以我请求您的帮助。

注册API

代码语言:javascript
复制
class RegistrationAPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

    def post(self, request, *args, **kwargs):
        print("Request: ", request.data)
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        print(request.data.get('is_consumer'))

        if request.data.get('is_consumer') == 'True':
            consumer_data = request.data.get('additional')

            interest_data = consumer_data.get('interests')
            #interest_data = consumer_data.getlist('interests')
            print("the data is ", interest_data)
            dob_values  = consumer_data.get("dob")
            dob         = get_dob(dob_values)
            age         = get_age(dob_values)
            gender      = consumer_data.get("gender")

            Consumer.objects.create(
                user=user, interests=interest_data, dob=dob, age=age, gender=gender)

                User.objects.filter(pk=user.pk).update(is_consumer=True)
            elif request.data.get('is_business') == 'True':
                Business.objects.create(
                    user=user, **request.data.get('additional'))
                User.objects.filter(pk=user.pk).update(is_business=True)
    
            # if serializer.is_valid():
            #     user = send_verification_email(request, serializer)
    
    
            # email sending for confirmation
            email_subject   = 'Activate your account'
            email_body      = 's'
    
            send_mail(
                email_subject,
                email_body,
                settings.DEFAULT_FROM_EMAIL,
                {user.email,},
            )
    
            return Response({"user": UserSerializer(user, context=self.get_serializer_context()).data, "token": AuthToken.objects.create(user)[1]})

注册序列化程序

代码语言:javascript
复制
class RegisterSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = User
        fields = ('username', 'email', 'password',
                  'is_consumer', 'is_business')
        extra_kwargs = {'password': {'write_only': True}}
        model = Consumer
        fields = ('user','interests')

    def create(self, validated_data):
        user_data = validated_data
        user = User.objects.create_user(user_data.get('username'),
                                        user_data.get('email'),
                                        user_data.get('password'))

        consumer = Consumer.objects.create(user=user, interests=validated_data.get('interests'))
        consumer.save()
        return user

兴趣序列化程序

代码语言:javascript
复制
class InterestsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Interests
        fields = ('technology', 'sports', 'health', 'diy', 'gaming', 'music', 'books', 'art',
                  'science', 'architecture', 'business', 'history', 'finance', 'biology', 'languages')

用户模型

代码语言:javascript
复制
class User(AbstractUser):
    email = models.CharField(max_length=100, unique=True)
    #token = models.CharField(max_length=150, unique=True)
    is_consumer = models.BooleanField(default=False)
    is_business = models.BooleanField(default=False)
    email_confirmation = models.BooleanField(default=False)

消费者模型

代码语言:javascript
复制
class Consumer(models.Model):
    GENDER_CHOICES = (
        ('Male', 'Male'),
        ('Female', 'Female'),
        ('Other', 'Other')
    )

    INTERESTS_CHOICES = (
        ('Sports', 'Sports'),
        ('Technology', 'Technology'),
        ('Health', 'Health'),
        ('DIY', 'DIY'),
        ('Gaming', 'Gaming'),
        ('Music', 'Music'),
        ('Books', 'Books'),
        ('Art', 'Art'),
        ('Science', 'Science'),
        ('Architecture', 'Architecture'),
        ('Business', 'Business'),
        ('History', 'History'),
        ('Finance', 'Finance'),
        ('Biology', 'Biology'),
        ('Languages', 'Languages')
    )

    user = models.OneToOneField(
        User, related_name='consumer', on_delete=models.CASCADE)
    interests = models.ForeignKey(Interests, related_name='interests', on_delete=models.CASCADE)
    # interests = models.ForeignKey(Interests, related_name='interests', on_delete=models.CASCADE)
    gender = models.CharField(max_length=6, choices=GENDER_CHOICES)
    dob = models.DateField(null=True)
    age = models.IntegerField(null=True)
    balance = models.FloatField(default=0)
    counter = models.IntegerField(default=0)
EN

回答 1

Stack Overflow用户

发布于 2021-06-10 00:35:36

消费者-利益关系应该是多对多而不是一对多(ForeignKey),因此更改字段类型,进行迁移,迁移并重试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67907794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档