在 django 中一次创建一系列对象

问题描述 投票:0回答:1

我正在创建一组数字,我想将它们每个保存在数据库中。我的做法是:

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

到目前为止我尝试过:

  1. 创建
    Nbr
    实例列表,
    bulk_create
    列表并返回列表 ->
    'list' object has no attribute 'save'
  2. 与上面相同,但只返回最后一个
    instance
    ->
    'NbrSetForm' object has no attribute 'save_m2m'. Did you mean: '_save_m2m'?
    (我的模型中没有many2many关系)
django django-models django-forms
1个回答
0
投票

您面临的问题似乎来自以下事实:您试图直接在

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
模型中的注释必填字段。

希望这对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.