使用get_or_create的Django表单

Joh*_*ohn 22 django django-forms

我正在使用Django ModelForms来创建表单.我已经设置了表单并且工作正常.

form = MyForm(data=request.POST)

if form.is_valid():
    form.save()
Run Code Online (Sandbox Code Playgroud)

我现在想要的是首先检查表单是否存在相同的记录.如果是的话,我希望它获取该对象的id,如果不是,我希望它将它插入数据库,然后给我该对象的id.是否可以使用以下内容:

form.get_or_create(data=request.POST)
Run Code Online (Sandbox Code Playgroud)

我知道我能做到

form = MyForm(instance=object)
Run Code Online (Sandbox Code Playgroud)

在创建表单时,但这不起作用,因为我仍然想要没有对象实例的情况

编辑:

说我的模型是

class Book(models.Model):
    name = models.CharField(max_length=50)
    author = models.CharField(max_length=50)
    price = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

我想要一个有人可以填写书籍的表格.但是,如果数据库中已有一本书具有相同的名称,作者和价格,我显然不希望再次添加此记录,所以只想找出它的ID而不是添加它.

我知道Django中有一个函数; get_or_create这样做但是表格有类似的东西吗?或者我必须做类似的事情

if form.is_valid(): 
    f = form.save(commit=false)
    id = get_or_create(name=f.name, author=f.author, price=f.price)
Run Code Online (Sandbox Code Playgroud)

谢谢

rz.*_*rz. 31

我喜欢这种方法:

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
       book, created = Book.objects.get_or_create(**form.cleaned_data)
Run Code Online (Sandbox Code Playgroud)

这样您就可以利用模型表单的所有功能(除了.save())和get_or_create快捷方式.

  • 但是,使用此解决方案,如果模型的任何值设置为唯一,则无法验证表单. (6认同)
  • `**`解包字典.请参阅:http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists (5认同)
  • @alfetopito一种方法是覆盖`Form`的`validate_unique`方法. (2认同)