【发布时间】:2018-11-08 01:30:00
【问题描述】:
我已经为自己找到了一种方法来创建和更新我的 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”应用的创建和更新视图是:
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,)))
现在的问题是这是正确的方法吗?在 set_a(a) 函数中使用 save() 命令是否正确?它似乎适用于这个非常简单的示例,但是如果模型增加,那么复杂性就会增加,并且这种方法可能不再可行......
【问题讨论】:
-
如果它有效,对我来说已经足够了。您应该为它编写测试以确保它以后仍然可以工作。
标签: django architecture