【问题标题】:Django ORM inputting List of List with unequal amount of elementsDjango ORM 输入元素数量不等的列表列表
【发布时间】:2021-02-03 22:01:21
【问题描述】:

我有一个列表,看起来像这样:

major_list = [['element 1', 'element 2', 'element 3'],['element 1' 'element 2' 'element 3', 'element 4']]

我已经在模型中创建了一个表,我希望能够访问如下所示的 Django ORM:

class Reviews(models.Model):
    element1 = models.CharField(max_length=400, default='')
    element2 = models.CharField(max_length=400, default='')
    element3 = models.CharField(max_length=400, default='')
    element4 = models.CharField(max_length=400, default='')

我正在尝试使用结构如下的 for 循环将这两个列表添加到表中:

for y in major_list:
    reviewz = StudentReviews(element1=y[0],
                             element2=y[1],
                             element3=y[2],
                             element4=y[3])
    reviewz.save()
                             

知道我的列表长度不同,我会假设列表不包含 element4 的实例只会填充为默认值,在本例中为:''。但我收到错误消息,说我的列表索引超出范围。这是有道理的,但我认为默认值会接管。

有没有人有任何想法/帮助。如果这令人困惑,我可以澄清更多。

谢谢!

【问题讨论】:

    标签: python django list django-models django-orm


    【解决方案1】:

    major_list的第一个元素只有3个元素,所以y[3]总会触发异常。作为一种解决方法,您可以为每个数组创建一个字典,每个键都具有每个项目的值。然后,您可以使用 ** 运算符将其作为参数传递给模型的新对象。

    major_list = [['element 1', 'element 2', 'element 3'],['element 1', 'element 2', 'element 3', 'element 4']]
    
    # for each element of the array
    for i in range(0, len(major_list)):
        # we create a dictionary
        d = dict()
        # for each item of the array
        for j in range(0, len(major_list[i])):
            # we create a key representing which field in database. notice that j is incremented to match element1, element2.....
            k = 'element' + str(j + 1)
            # we set the value of they
            d[k] = major_list[i][j]
            # we create a reviewz object using the dict
            reviewz = StudentReviews(**d)
            # we save the reviews object
            reviewz.save()
    

    更新

    如果您的模型字段名称不遵循特定模式,最好使用字典,因为您可以直接使用它们来创建和保存模型的新实例。每个键代表一个字段,您不需要设置所有键,只需设置所需的键即可。

    items = [
        {
            'first_name': 'John',
            'last_name': 'Doe',
            'birth_date': datetime.now()
        },
    
        {
            'first_name': 'John',
            'last_name': 'Doe',
            'birth_date': datetime.now()    
        },
    
        {
            'first_name': 'John',
            'last_name': 'Doe',
            'birth_date': datetime.now()
        }
    ]
    
    for item in items:
        reviewz = StudentReviews(**item)
        reviewz.save()
    

    【讨论】:

    • 我的问题是一个缩写版本,比如在你的 k = 'element' + str(j + 1) 中,我在列表中有其他元素,即日期,你将如何解决这个问题?
    • 如果我没有对这些值进行硬编码,所以我从抓取中收集它们,你将如何输入第二个答案?
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2020-07-18
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2021-02-04
    • 2020-01-24
    • 1970-01-01
    相关资源
    最近更新 更多