Проверка Django при создании новых экземпляров моделей

#django #django-models #django-forms #django-views #django-validation

#django #django-модели #django-forms #django-представления #django-проверка

Вопрос:

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

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

Также вы можете захотеть обернуть создание Test и ValidationClass объектов в transaction.atomic блок, чтобы убедиться, что их создание выполняется за одну транзакцию.

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

Комментарии:

1. Я добавил свои представления, используемые для создания этих моделей, в этот пост. Даже если я использую атомарные транзакции, как я могу обеспечить, чтобы при создании нового тестового объекта он также создавал новый объект TestValidation?

2. переопределение метода сохранения было бы лучшим решением, которое я могу придумать прямо сейчас

3. Привет @RajveerParikh если этот или любой другой ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы принять его, установив флажок. Я полагаю, что вы не приняли никаких ответов ни на один из заданных вами вопросов, поэтому я предполагаю, что вы не знали об этом (?). Это указывает более широкому сообществу, что вы нашли решение, и придает определенную репутацию как ответчику, так и вам самим. Нет никаких обязательств делать это.