我是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)
答案 0 :(得分:1)
django ORM无法提供数据库断言。但你可以在代码中做一些检查。
您可以覆盖save
的{{1}}方法并检查您所需的条件。如果不满足条件,请不要执行保存操作。
此外,您可能希望在Test
块中包装Test
和ValidationClass
个对象的创建,以确保在one transaction中执行它们的创建。
transaction.atomic