1

私はDjangoを初めて使い、Web APIを作成するためにDjango Rest Frameworkチュートリアルを使用しています。モデルの新しいインスタンスを作成するときの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オブジェクトと1対多の関係にあります(つまり、1つのテストに複数の検証クラスオブジェクトがリンクされている可能性があります)。このため、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に上書きして、そこに希望する条件があるかどうかを確認できます。条件が満たされない場合は、保存操作を実行しないでください。

また、あなたは彼らの作成はone transactionで実行されていることを確認するためにtransaction.atomicブロックにTestValidationClassオブジェクトの作成をラップすることをお勧めします。

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

saveメソッドのオーバーライドは、私が今考えることのできる最良の解決策になります。 –

+0

またはデータベースアサーションおよび/または手動でのチェックを定義してください。 –

関連する問題