1

Я новичок в Django и использую учебник Django Rest Framework для создания веб-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' 

То, что я хотел бы сделать, это убедиться в том, что каждый раз, когда создается новый объект Test, он связан, по меньшей мере, одного объекта ValidationClass. Тестируемый объект имеет отношение «один ко многим» к объекту ValidationClass (т. Е. Один тест может содержать несколько объектов класса проверки, связанных с ним). Из-за этого я не могу добавить ссылку на внешний ключ для объекта класса проверки в модели для теста. Так что, по сути, что я хочу сделать, каждый раз, когда создается новый объект 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

базы данных утверждений не доступны через Джанго ОРМ. Но вы можете сделать некоторые проверки в коде.

Вы можете переопределить save метод Test и проверить наличие необходимых условий. Если условия не были выполнены, не выполняйте операцию сохранения.

Также вы можете обернуть создание Test и ValidationClass объектов в 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

Или определить утверждение и/или проверку базы данных вручную. –

Смежные вопросы