如何在Django模型中保存对象列表?

2024-05-14 10:53:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在某个函数之后生成的对象列表,我希望它保存在django模型中 我尝试了查询集操作

mylist = [(u'england', u'1', u'cde', u'IMG1', u'CP1'), (u'england', u'1', u'cde', u'IMG2', u'CP1'), (u'england', u'2', u'abc', u'IMG1', u'CP1')] 

class Mymodel(models.Model):
   batch_id = models.AutoField(primary_key=True)
   batch_cola = models.CharField(max_length=100)
   batch_colb = models.CharField(max_length=100)
   batch_colc = models.CharField(max_length=100)
   batch_cold = models.CharField(max_length=100)
   batch_cole = models.CharField(max_length=100)

Tags: 对象django函数模型列表modelsbatchlength
3条回答

可以使用ForeignKey关系使父对象“包含”对象列表。

示例:

class Parent(models.Model):
    name = models.TextField()

class Child(models.Model):
    name = models.TextField()
    parent = models.ForeignKey(Parent)

然后:

p = Parent.objects.create(name="p")
c = p.child_set.create(name="c")
c2 = p.child_set.create(name="c2")

p.child_set.count()  # Should be 2

有关更多信息,请参阅Django中的ForeignKey文档。

创建模型的新实例有很好的文档记录-请参见creating objects

但是要显式地回答您的问题-一个解决方案是循环遍历元组列表,将适当的关键字参数传递给模型类,然后调用save()。最后一位很重要,否则将没有数据库级事务。

for t in mylist:
    Mymodel(batch_cola=t[0], batch_colb=t[1],
           batch_colc=t[2], batch_cold=t[3],
           batch_cole=t[4]).save()

您还可以使用models manager中的便利create()函数,这样就不需要调用^{}

for t in mylist:
    Mymodel.object.create(batch_cola=t[0], batch_colb=t[1],
           batch_colc=t[2], batch_cold=t[3], batch_cole=t[4])

文件上说这两个是equivalent-所以这有点像是一个偏好问题。

另一方面,在Python中,在创建类时应该遵循一个命名约定-“类名通常应该使用CapWords约定。”-see PEP-8 guidelines

class MyModel(models.Model):
    ...

您可以使用bulk_create方法-类似于:

Mymodel.objects.bulk_create([Mymodel(**{'batch_cola' : m[0],
                                        'batch_colb' : m[1],
                                        'batch_colc' : m[2],
                                        'batch_cold' : m[3],
                                        'batch_cole' : m[4]}
                            for m in mylist]);

该方法不是遍历对象并对每个对象调用save(),而是为所有对象生成一个数据库命中,而不是为每个对象生成一个命中。

相关问题 更多 >

    热门问题