#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 если этот или любой другой ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы принять его, установив флажок. Я полагаю, что вы не приняли никаких ответов ни на один из заданных вами вопросов, поэтому я предполагаю, что вы не знали об этом (?). Это указывает более широкому сообществу, что вы нашли решение, и придает определенную репутацию как ответчику, так и вам самим. Нет никаких обязательств делать это.