创建模型的新实例时的Django验证
我是Django新手,正在使用Django Rest框架教程创建web API 我有以下模型和视图,它们使用createAPIView创建每个模型的新实例创建模型的新实例时的Django验证,django,django-models,django-forms,django-views,django-validation,Django,Django Models,Django Forms,Django Views,Django Validation,我是Django新手,正在使用Django Rest框架教程创建web API 我有以下模型和视图,它们使用createAPIView创建每个模型的新实例 class ValidationClass (models.Model): id = models.IntegerField(primary_key=True, null=False) name = models.CharField(max_length=128, unique=True) parameters = m
class ValidationClass (models.Model):
id = models.IntegerField(primary_key=True, null=False)
name = models.CharField(max_length=128, unique=True)
parameters = models.TextField()
def __str__(self):
return '{} - {} - {}'.format(self.id, self.name, self.parameters)
db = 'qa_suite'
class Test(models.Model):
id = models.IntegerField(primary_key=True, null=False)
name = models.CharField(max_length=128, unique=True)
test_group = models.ForeignKey(TestGroup)
description = models.TextField()
query_text = models.TextField()
failure_condition = models.CharField(max_length=20, choices=(
('Error', 'Error'),
('Warn', 'Warn')
), default = 'Error')
status = models.CharField(max_length=20, choices=(
('Enabled', 'Enabled'),
('Disabled', 'Disabled')
), default = 'Enabled')
created = models.DateTimeField('Creation Date', auto_now_add=True, blank=True)
updated = models.DateTimeField('Date last updated', auto_now_add=True, blank=True)
def __str__(self):
return '{} - {}'.format(self.id, self.name)
db = 'qa_suite'
class TestValidation(models.Model):
test = models.ForeignKey(Test)
validation_class = models.ForeignKey(ValidationClass)
input_parameters = models.TextField()
def __str__(self):
return '{} - {} - {}'.format(self.test, self.validation_class, self.input_parameters)
class Meta:
unique_together = (('test', 'validation_class'),)
db = 'qa_suite'
我想做的是确保每次创建新的测试对象时,它都链接到至少一个ValidationClass对象。
测试对象与ValidationClass对象具有一对多的关系(即,一个测试可以链接多个验证类对象)。因此,我无法将外键引用添加到测试模型中的验证类对象。
所以从本质上说,我想做的是,每次创建一个新的测试对象时,我想确保也创建了一个新的TestValidation对象
观点:
# Post new Validation Class Object to database
class ValidationClassCreateAPI(generics.CreateAPIView):
serializer_class = ValidationClassSerializer
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
# Post new Test Validation Object to database
class TestValidationCreateAPI(generics.CreateAPIView):
serializer_class = TestValidationSerializer
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
# Post new Test Object to database
class TestCreateAPI(generics.CreateAPIView):
serializer_class = TestSerializer
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
数据库断言不能通过django ORM使用。但是您可以在代码中进行一些检查 您可以覆盖
save
方法的Test
,并在那里检查所需的条件。如果不满足条件,则不要执行保存操作
此外,您可能希望将测试
和验证类
对象的创建包装在事务.atomic
块中,以确保它们的创建在中执行
我已将用于创建这些模型的视图添加到此帖子中。即使我使用原子事务,我如何强制当创建一个新的测试对象时,它还必须创建一个新的TestValuestObjestObjt?重写保存方法将是我认为NoHiHi@ RajvErPARIKH的最佳解决方案,如果这个或任何答案已经解决了您的问题,请考虑通过点击复选标记来接受它。我想你没有接受任何关于你问的问题的答案,所以我猜你不知道(?)。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。
from django.db import transaction
def viewfunc(request):
# This code executes in autocommit mode (Django's default).
do_stuff()
with transaction.atomic():
# This code executes inside a transaction.
do_more_stuff()