首页 > 解决方案 > 在 Django 中保存和更新数据

问题描述

我有一个表格。该表单有许多文本字段,这些文本字段包含一些存储在数据库中的数据。这意味着每次打开该表单时,所有字段都有以前的数据。

在表单中,用户可以编辑旧文本字段、创建新文本字段和删除现有文本字段。当表单提交时,表单中的所有数据都会保存到数据库中。截至目前,要将数据保存到数据库中,我首先删除旧数据,然后将新数据保存到数据库中。我知道这种方法不是最优的,因为删除所有数据进行微小更改然后再次保存整个数据没有任何意义。

可能发生的事件

  1. 用户可能会编辑一些现有字段
  2. 用户可能会创建一些新字段
  3. 用户可能会删除一些现有字段
  4. 用户可能不会进行任何更改并仍然提交表单

那么,我怎样才能有效地处理储蓄呢?

模型

from django.db import models
from django.contrib.auth.models import User

class Sentence(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE)
    sentence = models.CharField(max_length = 250)

当前解决方案 -

from .models import Sentence

def index(request):
    if request.method == "POST" and request.user.is_authenticated:
        Sentence.objects.filter(user = request.user).delete() # Deleting all the old data
        sentences = request.POST.getlist("sentence")
        
        for sentence in sentences:
            s = Sentence(
                user = request.user,
                sentence = sentence
            )
            s.save() # Saving data

    # Some more code

标签: pythondjangodatabasedjango-modelsdjango-views

解决方案


我不确定完全理解删除部分,但如果你想从 0 重新开始并创建新句子,这是我看到的唯一解决方案。bulk_create但是,对于创建部分,使用( doc )有一个更有效的解决方案:

def index(request):
    if request.method == "POST" and request.user.is_authenticated:
        Sentence.objects.filter(user = request.user).delete() # Deleting all the old data
        sentences = request.POST.getlist("sentence")
        
        sentences = list(map(
                lambda x: Sentence(user=request.user, sentence=x),
                sentences
            ))
        Sentence.objects.bulk_create(sentences)
        # the rest of your code...        

优点是bulk_create只会访问数据库一次。在执行数据库操作时在 Django 中进行迭代真的很不常见。


推荐阅读