根据需要在 Django 模型中的条件基础上创建一个模型字段



我正在使用Python(3.6(和Django(2.0(进行一个项目,其中我需要根据父模型类中的字段的条件在子模型中创建一个字段。

如果服务是多个则需要路由配置字段,否则无需填写。

这是我的代码 models.py

从 models.py:

services = (
('Single', 'Single'),
('Multiple', 'Multiple'),
)

class DeploymentOnUserModel(models.Model):
deployment_name = models.CharField(max_length=256, )
credentials = models.TextField(blank=False)
project_name = models.CharField(max_length=150, blank=False)
project_id = models.CharField(max_length=150, blank=True)
cluster_name = models.CharField(max_length=256, blank=False)
zone_region = models.CharField(max_length=150, blank=False)
services = models.CharField(max_length=150, choices=services)
configuration = models.TextField(blank=True)
routing = models.TextField(blank=True)
def save(self, **kwargs):
if self.services == 'Multiple' and not self.routing and not self.configuration:
raise ValidationError("You must have to provide routing for multiple services deployment.")
super().save(**kwargs)

从 serializers.py:

class DeploymentOnUserSerializer(serializers.ModelSerializer):
class Meta:
model = DeploymentOnUserModel
fields = '__all__'

从 apiview.py:

class DeploymentsList(generics.ListCreateAPIView):
queryset = DeploymentOnUserModel.objects.all()
serializer_class = DeploymentOnUserSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
serializer = DeploymentOnUserSerializer(data=self.request.data)
validation = serializer.is_valid()
if validation is True:
perform_deployment(self.request.data)
self.create(request=self.request)
else:
return Response('You haven' passed the correct data ')
return Response(serializer.data)

后有效负载:

{
"deployment_name": "first_deployment",
"credentials":{
"type": "service_account",
"project_id": "project_id",
"private_key_id": "private_key_id",
"private_key": "-----BEGIN PRIVATE KEY",
"client_email": "client_email",
"client_id": "client_id",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "client_x509_cert_url"
},
"project_name": "project_name",
"project_id": "project_id",
"cluster_name": "numpy",
"zone_region": "europe-west1-d",
"services": "Single",
"configuration": "",
"routing": ""
}

更新:现在我已经为这些模型实现了 apiview 和序列化程序。当我提交带有services=Single的 post 请求时,没有configuration & routing的值,它会返回You haven't passed the correct data.

这意味着保存方法不起作用。 请帮帮我!

提前感谢!

除了我的评论,您还可以覆盖AwdModel模型的save()方法。

如果是

新实例, from django.core.exceptions import ValidationError class AwdModel(UserAccountModel): source_zip = models.FileField(upload_to='media/awdSource/', name='awd_source') routing = models.TextField(name='routing', null=True) def save(self, **kwargs): if not self.id and self.services == 'Multiple' and not self.routing: raise ValidationError("error message") super().save(**kwargs) self.id将是null或类似的,因此仅在创建实例时进行验证检查

更新-1使用此有效负载开机自检

{
"deployment_name": "first_deployment",
"credentials":{"test_key":"test_value"},
"project_name": "project_name",
"project_id": "project_id",
"cluster_name": "numpy",
"zone_region": "europe-west1-d",
"services": "Single",
"configuration": "",
"routing": ""
}

更新-2为您的序列化程序尝试此操作,

class DeploymentOnUserSerializer(serializers.ModelSerializer):
credentials = serializers.JSONField()
class Meta:
model = DeploymentOnUserModel
fields = '__all__'

最新更新