Я разработал для себя способ создания и обновления моих моделей Django.Но мне интересно, если это правильный путь.Допустим, у нас есть две модели A и B, где у одной A может быть много B.
Здесь B имеет два пользовательских ввода b1, b2 и «b3» определяется как: b3 = b1 + b2
Здесь A также имеет два поля пользовательского ввода a1, a2 и «a3»определяется как: a3 = a1 + a2 + b [0] .b3 + b [1] .b3 + ... + b [N] .b3
Здесь A зависит от нуля или более B.Если одно из изменений B будет изменено, то A потребуется пересчитать его поле a3.
Поэтому модели A и B определяются как:
class A(models.Model):
a1 = models.FloatField(default=0)
a2 = models.FloatField(default=0)
a3 = models.FloatField(default=0)
@classmethod
def create( cls, a1, a2):
a = cls(a1 = a1, a2 = a2)
return a
def set_a(self, a):
a.a3 = a.a1 + a.a2
bs = B.objects.filter(a=a)
for b in bs:
a.a3 += b.b3
a.save()
return a
class B(models.Model):
a = models.ForeignKey('a.A', related_name='bs', on_delete=models.CASCADE)
b1 = models.FloatField(default=0)
b2 = models.FloatField(default=0)
b3 = models.FloatField(default=0)
@classmethod
def create( cls, a, b1, b2):
b = cls( a = a, b1 = b1, b2 = b2)
return b
def set_b(self, b):
b.b3 = b.b1 + b.b2
b.save()
b.a.set_a(b.a)
return b
Представления создания и обновления для "a "app are:
class ACreateView(LoginRequiredMixin, CreateView):
model = A
template_name = 'a/create.html'
form_class = AForm
def form_valid(self, form):
a = A.create( a1 = form.cleaned_data['a1'],
a2 = form.cleaned_data['a2'])
a = a.set_a(a)
return HttpResponseRedirect(reverse('a:detail', args=(a.id,)))
class AUpdateView(LoginRequiredMixin, UpdateView):
model = A
template_name = 'a/detail-update.html'
form_class = AForm
def get_object(self):
return get_object_or_404(A, pk=self.kwargs['pk_a'])
def form_valid(self, form):
a = self.get_object()
a.a1 = form.cleaned_data['a1']
a.a2 = form.cleaned_data['a2']
a = a.set_a(a)
return HttpResponseRedirect(reverse('a:detail', args=(a.id,)))
Вопрос теперь в том, правильный ли это путь?Правильно ли использовать команду save () в функциях set_a (a)?Кажется, это работает для этого очень простого примера, но если модели увеличатся, сложность возрастет, и этот метод, возможно, больше не будет жизнеспособным ...