创建模型的新实例时

时间:2016-10-21 18:46:30

标签: django django-models django-forms django-views django-validation

我是Django的新手,并且正在使用Django Rest Framework教程来创建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'

我想要做的是确保每次创建一个新的Test对象时,它都链接到至少一个ValidationClass对象。 Test对象与ValidationClass对象具有一对多的关系(即一个测试可以有多个与之链接的验证类对象)。因此,我无法在Test的模型中为验证类对象添加外键引用。 基本上,我想要做的是,每次创建一个新的Test对象时,我都想确保创建一个新的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)

1 个答案:

答案 0 :(得分:1)

django ORM无法提供数据库断言。但你可以在代码中做一些检查。

您可以覆盖save的{​​{1}}方法并检查您所需的条件。如果不满足条件,请不要执行保存操作。

此外,您可能希望在Test块中包装TestValidationClass个对象的创建,以确保在one transaction中执行它们的创建。

transaction.atomic