根据 Django 模型中的条件根据需要创建模型字段
Make a model field as required on the base of a condition in Django Models
我正在用 Python(3.6) 和 Django(2.0) 做一个项目,我需要根据父模型中字段的条件使子模型中的字段成为必需字段 class。
如果 service 是多个,则 routing 和 configuration 字段将是必需的,否则没必要填。
这是我来自 models.py
的代码
From 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)
From serializers.py:
class DeploymentOnUserSerializer(serializers.ModelSerializer):
class Meta:
model = DeploymentOnUserModel
fields = '__all__'
From 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)
Post payload:
{
"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": ""
}
Update: Now I have implemented apiview and serializers for these models. When I submit a post request with the services=Single
without the values for configuration & routing
it returns You haven't passed the correct data.
这意味着保存方法不起作用。
请帮助我!
提前致谢!
除了我的评论之外,您还可以覆盖 AwdModel
模型的 save()
方法。
<b>from django.core.exceptions import ValidationError</b>
class AwdModel(UserAccountModel):
source_zip = models.FileField(upload_to='media/awdSource/', name='awd_source')
routing = models.TextField(name='routing'<b>, null=True</b>)
<b>def save(self, **kwargs):
if not self.id and self.services == 'Multiple' and not self.routing:
raise ValidationError("error message")
super().save(**kwargs)</b>
self.id
将是 null
或类似的,如果它是一个新实例,因此只有在创建实例时才会进行验证检查
Update-1 使用此负载 POST
{
"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": ""
}
update-2
为你的序列化程序试试这个,
class DeploymentOnUserSerializer(serializers.ModelSerializer):
<b>credentials = serializers.JSONField()</b>
class Meta:
model = DeploymentOnUserModel
fields = '__all__'
我正在用 Python(3.6) 和 Django(2.0) 做一个项目,我需要根据父模型中字段的条件使子模型中的字段成为必需字段 class。
如果 service 是多个,则 routing 和 configuration 字段将是必需的,否则没必要填。
这是我来自 models.py
的代码From 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)
From serializers.py:
class DeploymentOnUserSerializer(serializers.ModelSerializer):
class Meta:
model = DeploymentOnUserModel
fields = '__all__'
From 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)
Post payload:
{
"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": ""
}
Update: Now I have implemented apiview and serializers for these models. When I submit a post request with the
services=Single
without the values forconfiguration & routing
it returnsYou haven't passed the correct data.
这意味着保存方法不起作用。 请帮助我!
提前致谢!
除了我的评论之外,您还可以覆盖 AwdModel
模型的 save()
方法。
<b>from django.core.exceptions import ValidationError</b>
class AwdModel(UserAccountModel):
source_zip = models.FileField(upload_to='media/awdSource/', name='awd_source')
routing = models.TextField(name='routing'<b>, null=True</b>)
<b>def save(self, **kwargs):
if not self.id and self.services == 'Multiple' and not self.routing:
raise ValidationError("error message")
super().save(**kwargs)</b>
self.id
将是 null
或类似的,如果它是一个新实例,因此只有在创建实例时才会进行验证检查
Update-1 使用此负载 POST
{
"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": ""
}
update-2
为你的序列化程序试试这个,
class DeploymentOnUserSerializer(serializers.ModelSerializer):
<b>credentials = serializers.JSONField()</b>
class Meta:
model = DeploymentOnUserModel
fields = '__all__'