同时在两个数据库中插入数据

时间:2018-04-13 18:23:29

标签: python django

我在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信息编辑时,不会发生错误,但它也不会保存模型更改信息

您是否可以帮助我,让我知道是否有更正确,更简单的方法来存储模型中的变更历史记录?

1 个答案:

答案 0 :(得分:2)

由于您的Change模型与Ip模型具有外键关系,因此 view.py 中的ip_change会显示Change的实例然后你应该用ip_change.ip = request.number替换ip_change.ip = ip_edit,因为ip_editIp模型的实例。

仅当两种表单都有效时,您是否要对IpChange型号执行保存操作?如果您需要,那么此代码有一个非常严重的问题,人们有时会忽略这个问题并且该问题与违反数据库完整性有关。试着在form.is_valid()返回Truechange_form.is_valid()返回False时考虑一下情况。如果发生这种情况,您只会将数据保存到Ip数据库表中,而不会将任何内容保存到Change数据库表中,因为将无法访问此行ip_change.save()。如果发生这种情况,数据完整性将被破坏,我想您不希望这样 - 您可能希望确保两个save操作都执行或不执行。您应该像if form.is_valid() and change_form.is_valid()一样同时验证这两个表单,并将其余的逻辑放入该块中。

P.S。

由于我开始讨论违反数据库完整性的问题,您还应该查看atomic database transactions,了解它可能很有用。