django 如果类型不同,则更改模型字段

vatpfxk5  于 2023-03-13  发布在  Go
关注(0)|答案(1)|浏览(120)

我有两项服务:作业和服务器。它们非常相似,但服务器也有字段“主机”和“端口”。我需要模型来识别服务类型,如果是作业,它必须自动将“主机”和“端口”字段设置为None,并将其保存到数据库表中。这可能吗?我尝试过在串行化程序中使用不同类型的验证器,但没有任何效果。
下面是我的模型:

class Service(models.Model):

    class ServiceType(models.TextChoices):
        JOB = 'Job', _('Job')
        SERVER = 'Server', _('Server')

    type = models.CharField(max_length=10, choices=ServiceType.choices, default=ServiceType.JOB)
    code_name = models.CharField(max_length=200)
    human_name = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    host = models.CharField(max_length=200)
    port = models.IntegerField(
        validators=[MinValueValidator(0), MaxValueValidator(65535)])
    
    def __str__(self):
        return self.type

如您所见,只能有两种类型:服务器和作业。我需要自动设置主机和端口字段为无,如果类型== '作业'。听起来很容易,但我想我m not expirienced enough to find out the solution. I也尝试使用验证器在我的串行化,但它没有帮助:

class ServiceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Service
        fields = '__all__'

    def validate(self, data):
        if data['type'] == 'Job':
            data['host'] = None
            data['port'] = None

        return data

如果type ==“Job”,我希望看到数据库中的主机和发布字段等于None

yws3nbqq

yws3nbqq1#

试试这个:

class ServiceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Service
        fields = '__all__'
    
    def create(self, validated_data):
        if validated_data['type'] == 'job':
            validated_data['host'], validated_data['port'] = None
        return super().create(validated_data)

请记住,您必须为模型中可能未填充值的字段(在您的示例中为“host”和“port”)添加blank=True,null=True

相关问题