【问题标题】:Create multiple instances of the model in one query在一个查询中创建模型的多个实例
【发布时间】:2021-01-05 07:29:57
【问题描述】:

有一个包含多个字段的表单和一个处理它的视图

views.py

class VehiclesBlacklistAddView(ObjectAddView):
    model = Vehicle
    form_class = VehicleForm
.....

    def process_valid_form(self, request, form):
        form.instance.save()

没关系,它有效。但是现在我希望能够通过逗号向表单的 item_id 字段之一添加多个值,并创建多个实例而不是一个

views.py

def process_valid_form(self, request, form):
    # print(form.instance.__dict__)
    items = [id.strip() for id in form.instance.item_id.split(',')]
    for i in items:
        form.instance(item_id=i).save()

但出现错误

'Vehicle' object is not callable

models.py

class Vehicle(models.Model):

    item_type = models.CharField()
    item_id = models.CharField()
    desc = models.CharField()

【问题讨论】:

    标签: python django django-forms django-views django-class-based-views


    【解决方案1】:

    为此,我推荐 Django Formsets:https://docs.djangoproject.com/en/3.1/topics/forms/formsets/

    我还建议您查看 bulk_create : https://docs.djangoproject.com/en/3.0/ref/models/querysets/#bulk-create

    但要回答你的问题:

    错误是针对form.instance(item_id=i).save()这一行

    这是一个已经创建的实例,一个Vehicle。 为了创建更多,您应该导入 Vehicle 并创建它的实例并保存它们:

    for i in items:
        instance = Vehicle(
            item_id=i, # this is buggy and will not be unique the next submission - should be an AutoField
            item_type=form.cleaned_data.get('item_type'),
            desc=form.cleaned_data.get('desc')
        )
        instance.save()
    

    然后在表单保存时不要保存绑定到表单的一个实例。

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 1970-01-01
      • 2015-08-01
      • 2023-03-23
      • 1970-01-01
      • 2023-02-11
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多