我正在使用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__'