Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在django中从左表数据中删除验证_Django_Validation_Django Rest Framework - Fatal编程技术网

如何在django中从左表数据中删除验证

如何在django中从左表数据中删除验证,django,validation,django-rest-framework,Django,Validation,Django Rest Framework,我是Django的新手,我想在屏幕截图中帮助验证,除了正确验证的用户信息外,还有公司名称、位置、标题和用户位置字段 但是我想从公司名称、位置、标题和用户位置字段中删除验证,怎么办 请找到上面的api截图和 请查找以下脚本 视图.py class UserRegistrationView(generics.CreateAPIView): """ Register a new user. """ queryset = User.objects.all() pe

我是Django的新手,我想在屏幕截图中帮助验证,除了正确验证的用户信息外,还有公司名称、位置、标题和用户位置字段 但是我想从公司名称、位置、标题和用户位置字段中删除验证,怎么办

请找到上面的api截图和

请查找以下脚本

视图.py

class UserRegistrationView(generics.CreateAPIView):
    """
    Register a new user.
    """
    queryset = User.objects.all()
    permission_classes = (permissions.AllowAny, )

    def get_serializer_class(self, user_type=None):
        if user_type == 'student':
            return StudentRegistrationSerializer
        return ProfessionalRegistrationSerializer

    def post(self, request, user_type=None, format=None):
        serializer_class = self.get_serializer_class(user_type)
        serializer = serializer_class(data=request.data, context={'request': request})

        if serializer.is_valid(raise_exception=True)

            user = serializer.save(work_status=user_type)
            token, created = Token.objects.get_or_create(user=user)
            data = BasicUserSerializer(user, context={'request': request}).data
            data.update({"token": token.key})
            return Response(data)
class ProfessionalRegistrationSerializer(serializers.HyperlinkedModelSerializer):

    password = serializers.CharField(max_length=20, write_only=True)
    experiences = ExperienceSerializer(required=False)
    email = serializers.EmailField()
    first_name = serializers.CharField(max_length=30)
    last_name = serializers.CharField(max_length=30)

    class Meta:
        model = User
        fields = ('url', 'id', 'first_name', 'last_name', 'email', 'password',
        'experiences', 'headline')

    def validate_email(self, value):
        from validate_email_address import validate_email
        if User.all_objects.filter(email=value.lower()).exists():
            raise serializers.ValidationError('User with this email already exists.')
        # if not validate_email(value.lower(), check_mx=True):
        #     raise serializers.ValidationError('It looks like you may have entered an incorrect email address.')
        return value.lower()

    def create(self, validated_data):
        experiences = validated_data.pop('experiences')
        password = validated_data.pop('password')
        email = validated_data.pop('email')
        user = User.objects.create(
            username=email.lower(),
            email=email.lower(),
            role_id=1)
        user.set_password(password)
        user.save()
        user_location = experiences.pop('user_location')
        if hasattr(user, 'location'):
            user.location.location = user_location
            user.save()
        else:
            UserLocation.objects.create(user=user, location=user_location)
            Experience.objects.create(user=user)
        return user 
序列化.py

class UserRegistrationView(generics.CreateAPIView):
    """
    Register a new user.
    """
    queryset = User.objects.all()
    permission_classes = (permissions.AllowAny, )

    def get_serializer_class(self, user_type=None):
        if user_type == 'student':
            return StudentRegistrationSerializer
        return ProfessionalRegistrationSerializer

    def post(self, request, user_type=None, format=None):
        serializer_class = self.get_serializer_class(user_type)
        serializer = serializer_class(data=request.data, context={'request': request})

        if serializer.is_valid(raise_exception=True)

            user = serializer.save(work_status=user_type)
            token, created = Token.objects.get_or_create(user=user)
            data = BasicUserSerializer(user, context={'request': request}).data
            data.update({"token": token.key})
            return Response(data)
class ProfessionalRegistrationSerializer(serializers.HyperlinkedModelSerializer):

    password = serializers.CharField(max_length=20, write_only=True)
    experiences = ExperienceSerializer(required=False)
    email = serializers.EmailField()
    first_name = serializers.CharField(max_length=30)
    last_name = serializers.CharField(max_length=30)

    class Meta:
        model = User
        fields = ('url', 'id', 'first_name', 'last_name', 'email', 'password',
        'experiences', 'headline')

    def validate_email(self, value):
        from validate_email_address import validate_email
        if User.all_objects.filter(email=value.lower()).exists():
            raise serializers.ValidationError('User with this email already exists.')
        # if not validate_email(value.lower(), check_mx=True):
        #     raise serializers.ValidationError('It looks like you may have entered an incorrect email address.')
        return value.lower()

    def create(self, validated_data):
        experiences = validated_data.pop('experiences')
        password = validated_data.pop('password')
        email = validated_data.pop('email')
        user = User.objects.create(
            username=email.lower(),
            email=email.lower(),
            role_id=1)
        user.set_password(password)
        user.save()
        user_location = experiences.pop('user_location')
        if hasattr(user, 'location'):
            user.location.location = user_location
            user.save()
        else:
            UserLocation.objects.create(user=user, location=user_location)
            Experience.objects.create(user=user)
        return user 
另一个serializes.py用于体验

class ExperienceSerializer(serializers.HyperlinkedModelSerializer):

    user_location = LocationField()
    location = LocationField()

    class Meta:
        model = Experience
        fields = ('id', 'company_name', 'company', 'description', 'location',
        'title', 'start_date', 'end_date', 'is_current', 'user_location')
我想从公司名称、公司、描述、位置、标题、开始日期、结束日期、用户位置删除验证

实际上,这些字段是第二页,意味着在完成第一步后,用户将继续第二步,因此第二步字段是可选的

class ExperienceSerializer(serializers.HyperlinkedModelSerializer):

    user_location = LocationField()
    location = LocationField()

    class Meta:
        model = Experience
        fields = ('id', 'company_name', 'company', 'description', 'location',
            'title', 'start_date', 'end_date', 'is_current', 'user_location')

        def create(self, validated_data):

            return Experience.objects.create(field_a='value', field_b='value')
在上面的类中,应该如何删除的验证

"error_msg": {
        "location": [
            "Expected a dictionary of items but got type \"str\"."
        ],
        "start_date": [
            "Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]."
        ],
        "end_date": [
            "Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]]."
        ],
        "user_location": [
            "Expected a dictionary of items but got type \"str\"."
        ]
    } 
体验模式

class Experience(models.Model):

    """
    """

    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='experiences')
    company_name = models.CharField(max_length=200, db_index=True, blank=True)
    company = models.ForeignKey('organisations.Organisation', null=True, blank=True, on_delete=models.SET_NULL)
    description = models.TextField(null=True, blank=True)
    location = models.ForeignKey('regions.Location', null=True, blank=True, on_delete=models.SET_NULL)
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    title = models.CharField(max_length=200, db_index=True, blank=True)
    is_current = models.BooleanField(default=False)
    is_associated = models.BooleanField(default=False)
    created_at = models.DateTimeField(_('created at'), auto_now_add=True)
    modified_at = models.DateTimeField(_('modified at'), auto_now=True)

    class Meta:
        db_table = 'experience'
        verbose_name = _('experience')
        verbose_name_plural = _('experiences')
        ordering = ('-start_date',)

    def __str__(self):
        return getattr(self, 'title', '')

    @property
    def experience(self):
        if self.end_date:
            return (self.end_date - self.start_date).days
        else:
            return (datetime.datetime.now().date() - self.start_date).days

    def get_formated_experience(self):
        days = self.experience
        total_months = round(days/30)
        years = int(total_months/12)
        months = round(((total_months/12)%1)*12)
        year_txt = 'years' if years > 1 else 'year'
        month_txt = 'months' if months > 1 else 'month'
        return "%s %s %s %s" %(years, year_txt, months, month_txt)
class Location(models.Model):
    """
    """
    id = models.TextField(primary_key=True)
    display_name = models.TextField(null=True, blank=True)
    latitude = models.DecimalField(max_digits=15, decimal_places=10, null=True, blank=True)
    longitude = models.DecimalField(max_digits=15, decimal_places=10, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    objects = LocationManager()
位置模型

class Experience(models.Model):

    """
    """

    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='experiences')
    company_name = models.CharField(max_length=200, db_index=True, blank=True)
    company = models.ForeignKey('organisations.Organisation', null=True, blank=True, on_delete=models.SET_NULL)
    description = models.TextField(null=True, blank=True)
    location = models.ForeignKey('regions.Location', null=True, blank=True, on_delete=models.SET_NULL)
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    title = models.CharField(max_length=200, db_index=True, blank=True)
    is_current = models.BooleanField(default=False)
    is_associated = models.BooleanField(default=False)
    created_at = models.DateTimeField(_('created at'), auto_now_add=True)
    modified_at = models.DateTimeField(_('modified at'), auto_now=True)

    class Meta:
        db_table = 'experience'
        verbose_name = _('experience')
        verbose_name_plural = _('experiences')
        ordering = ('-start_date',)

    def __str__(self):
        return getattr(self, 'title', '')

    @property
    def experience(self):
        if self.end_date:
            return (self.end_date - self.start_date).days
        else:
            return (datetime.datetime.now().date() - self.start_date).days

    def get_formated_experience(self):
        days = self.experience
        total_months = round(days/30)
        years = int(total_months/12)
        months = round(((total_months/12)%1)*12)
        year_txt = 'years' if years > 1 else 'year'
        month_txt = 'months' if months > 1 else 'month'
        return "%s %s %s %s" %(years, year_txt, months, month_txt)
class Location(models.Model):
    """
    """
    id = models.TextField(primary_key=True)
    display_name = models.TextField(null=True, blank=True)
    latitude = models.DecimalField(max_digits=15, decimal_places=10, null=True, blank=True)
    longitude = models.DecimalField(max_digits=15, decimal_places=10, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    objects = LocationManager()

根据快照,您将得到两种类型的验证错误

  • 字段是必需的
  • 需要一本字典,但得到一个字符串
  • 将字段设置为模型中的必填字段时,会发生必填字段错误。您可以通过在模型中为该字段添加
    blank=True
    来更改此设置。 对于第二个错误,序列化程序需要一个字典,而您正在发送一个字符串。您可以通过编写自定义创建方法来删除此验证

    class ExperienceSerializer(serializers.HyperlinkedModelSerializer):
    
        user_location = LocationField()
        location = LocationField()
    
        class Meta:
            model = Experience
            fields = ('id', 'company_name', 'company', 'description', 'location',
                    'title', 'start_date', 'end_date', 'is_current', 'user_location')
    
        def create(self, validated_data):
            # you create code for that models.
    
    你的Serializer会是这样的

    class ProfessionalRegistrationSerializer(serializers.HyperlinkedModelSerializer):
    
        password = serializers.CharField(max_length=20, write_only=True)
        experiences = ExperienceSerializer(required=False)
        email = serializers.EmailField()
        first_name = serializers.CharField(max_length=30)
        last_name = serializers.CharField(max_length=30)
    
        class Meta:
            model = User
            fields = ('url', 'id', 'first_name', 'last_name', 'email', 'password',
            'experiences', 'headline')
    
        def validate_email(self, value):
            from validate_email_address import validate_email
            if User.all_objects.filter(email=value.lower()).exists():
                raise serializers.ValidationError('User with this email already exists.')
            # if not validate_email(value.lower(), check_mx=True):
            #     raise serializers.ValidationError('It looks like you may have entered an incorrect email address.')
            return value.lower()
    
        def create(self, validated_data):
            experiences = validated_data.get('experiences')
            password = validated_data.get('password')
            email = validated_data.get('email')
            user = User.objects.create(
                username=email.lower(),
                email=email.lower(),
                role_id=1)
            user.set_password(password)
            user.save()
            user_location = experiences.get('user_location')
            location_object = None
            if user_location:
                location_object, created = Location.objects.get_or_create(display_name=user_location.get('display_name'), latitude= user_location.get('latitude'), longitude=user_location.get('longitude'))
            user_experience = Experience.objects.create(user=user, company_name=experiences.get('company_name'), location=location_object)
            return user 
    


    请显示您的序列化程序代码。我已经用脚本编辑了我的问题,所以请看一眼:)您可以在模型中设置
    blank=True
    。感谢Fazil Zaid,请查看class Professional RegistrationSerializer(serializers.HyperlinkedModelSerializer):这里已经定义了def create(自我验证的_数据):请指出应在何处进行更改以删除“需要一个字典并获得一个字符串”的验证。我是django plz的新手。请帮助我:)您提到的序列化程序是针对用户模型的。因此,create函数将用于用户对象。要删除验证的字段属于经验模型,因此创建函数将用于经验序列化程序。是否要解释“验证的\u数据”的工作原理?
    validated\u data
    是一个包含该序列化程序所有有效数据的字典。您不需要将其传递给序列化程序。当您调用
    serializerr.save()
    时,将自动调用该create函数,谢谢您的回复。为什么放置**像**验证的数据?例如:返回YourModel.objects.create(user=self.context.get('user'),**已验证的数据)