1

我是Django的新手,並且正在使用Django Rest Framework教程來創建Web API。創建模型的新實例時的Django驗證

我有以下模型,我有意見使用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對象。 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

數據庫斷言無法通過Django的ORM。但你可以在代碼中進行一些檢查。

您可以覆蓋save方法Test並檢查您所需的條件。如果條件不滿足,請勿執行保存操作。

另外,您也可能想將TestValidationClass對象的創建包裝在transaction.atomic塊中以確保其創建在one transaction中執行。

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() 
+0

我已將用於創建這些模型的視圖添加到此帖子中。即使我使用原子事務,如何在創建新的測試對象時強制執行該操作,還必須創建一個新的TestValidation對象? – RajveerParikh

+0

重寫保存方法將是我現在可以想到的最佳解決方案 –

+0

或者手動定義數據庫斷言和/或檢查。 –

相關問題