我正在创建一组数字,我想将它们每个保存在数据库中。我的做法是:
class NbrSetForm(forms.ModelForm):
last_number = Nbr.objects.order_by("-number").first().number
start_number = forms.IntegerField(required=True, initial=last_number+1)
end_number = forms.IntegerField(required=True, initial=last_number+1)
class Meta:
model = Nbr
fields = ["start_number", "end_number", ...]
exclude = ["number"]
def clean(self):
cleaned_data = super().clean()
s = int(cleaned_data["start_number"])
e = int(cleaned_data["end_number"]) + 1
self.number_list = [n for n in range(s, e)]
def save(self, commit=False):
for n in self.number_list:
print("number to create", number)
instance = Nbr.objects.create(number=n, ...)
print("all done", instance)
return super.save(self)
型号:
class Nbr(models.Model):
number = models.BigIntegerField() # not unique!
created_date = models.DateTimeField(auto_now_add=True)
somefield = models.ForeignKey(...)
someotherfield = models.BooleanField(blank=True)
...
我可以在控制台中看到两个
print
语句的输出(number
在这里有一个合理的值)。但是数据库中没有保存任何内容,并且我从 IntegretyError
语句中得到一个 return super().save(self)
(我猜就是这个)说:NOT NULL constraint failed: app_nbr.number
。
到目前为止我尝试过:
Nbr
实例列表,bulk_create
列表并返回列表 -> 'list' object has no attribute 'save'
instance
-> 'NbrSetForm' object has no attribute 'save_m2m'. Did you mean: '_save_m2m'?
(我的模型中没有many2many关系)您面临的问题似乎来自以下事实:您试图直接在
Nbr
类中保存 NbrSetForm
对象,而不指定 number
字段,并且 django 正在引发 IntegrityError
因为 number
字段根据您的模型定义不能为空。
您应该在表单的
Nbr
方法中创建并保存 save
实例,因此您的 save
方法应如下所示:
class NbrSetForm(forms.ModelForm):
# your other methods
def save(self, commit=False):
instance_list = []
for n in self.number_list:
instance = Nbr(number=n, ...) # Add the appropriate field values
instance.save()
instance_list.append(instance)
print("all done", instance_list)
return instance_list
确保您从表单中排除的字段是
Nbr
模型中的注释必填字段。
希望这对您有帮助。