我在Django的应用程序中有两个模型
更改模型仅用于存储在Model Ip中生成的更改日志
我的models.py
class Change(models.Model):
author = models.ForeignKey('auth.User', null=False, on_delete=models.CASCADE, default='auth.User')
ip = models.ForeignKey('Ip', on_delete=models.CASCADE, default='')
old_cluster = models.ForeignKey('Cluster', on_delete=models.CASCADE, default='')
old_status = models.ForeignKey('Status', on_delete=models.CASCADE, default='')
new_cluster = models.CharField(max_length=20)
new_status =models.CharField(max_length=20)
change_date = models.DateTimeField(default=timezone.now)
class Ip(models.Model):
author = models.ForeignKey('auth.User', null=False, on_delete=models.CASCADE, default='auth.User')
number = models.CharField(max_length=20, unique=True, default='')
status = models.ForeignKey('Status', on_delete=models.CASCADE, default='')
cluster = models.ForeignKey('Cluster', on_delete=models.CASCADE, default='')
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.number
class Meta:
ordering = ('number',)
my views.py
def ip_edit(request, id):
ip_edit = get_object_or_404(Ip, id=id)
form = EditManagementForm(request.POST, instance=ip_edit)
change_form = ChangeLogsForm()
if request.method == "POST":
if form.is_valid():
ip_edit = form.save(commit=False)
ip_edit.save()
change_form = ChangeLogsForm(request.POST)
if change_form.is_valid():
ip_change = change_form.save(commit=False)
ip_change.author = request.user
ip_change.ip = request.number
ip_change.save()
return redirect('/app/management')
else:
form = EditManagementForm(instance=ip_edit)
args = {
'form': form,
}
return render(request, 'app/ip_edit.html', args
和我的forms.py
class EditManagementForm(forms.ModelForm):
class Meta:
model = Ip
fields = (
'number',
'status',
'cluster',
)
widgets = {
'number': TextInput(attrs={'class': 'ls-form-text'}),
}
class ChangeLogsForm(forms.ModelForm):
class Meta:
model = Change
fields = (
'ip',
'old_cluster',
'old_status',
'new_cluster',
'new_status',
)
当我保存ip信息编辑时,不会发生错误,但它也不会保存模型更改信息
您是否可以帮助我,让我知道是否有更正确,更简单的方法来存储模型中的变更历史记录?
答案 0 :(得分:2)
由于您的Change
模型与Ip
模型具有外键关系,因此 view.py 中的ip_change
会显示Change
的实例然后你应该用ip_change.ip = request.number
替换ip_change.ip = ip_edit
,因为ip_edit
是Ip
模型的实例。
仅当两种表单都有效时,您是否要对Ip
和Change
型号执行保存操作?如果您需要,那么此代码有一个非常严重的问题,人们有时会忽略这个问题并且该问题与违反数据库完整性有关。试着在form.is_valid()
返回True
并change_form.is_valid()
返回False
时考虑一下情况。如果发生这种情况,您只会将数据保存到Ip
数据库表中,而不会将任何内容保存到Change
数据库表中,因为将无法访问此行ip_change.save()
。如果发生这种情况,数据完整性将被破坏,我想您不希望这样 - 您可能希望确保两个save
操作都执行或不执行。您应该像if form.is_valid() and change_form.is_valid()
一样同时验证这两个表单,并将其余的逻辑放入该块中。
P.S。
由于我开始讨论违反数据库完整性的问题,您还应该查看atomic database transactions,了解它可能很有用。