在一个查询中创建模型的多个实例
Create multiple instances of the model in one query
有一个包含多个字段的表单和一个处理它的视图
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()
为此,我推荐 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()
然后不保存绑定到表单的一个实例,在表单保存时。
有一个包含多个字段的表单和一个处理它的视图
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()
为此,我推荐 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()
然后不保存绑定到表单的一个实例,在表单保存时。