Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建模型的新实例时的Django验证_Django_Django Models_Django Forms_Django Views_Django Validation - Fatal编程技术网

创建模型的新实例时的Django验证

创建模型的新实例时的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

我是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 = 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()