如何将字典列表保存为Django数据库模型字段中的每个对象?

2024-09-27 19:27:26 发布

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

我将使人们更好地理解我提出的问题(How to store a dictionary in a Django database model's field?):

我有这本字典

sample_dict =  [

{'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 3, 11),
  'debe': 500.0},
 {'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 4, 11),
  'debe': 500.0},
 {'sale_id': 15,
  'name': 'Yamila',
  'fecha': datetime.date(2021, 4, 14),
  'debe': 2000.0}

]

我希望将其存储在Django数据库(SQLite3)中,如下所示:

enter image description here

但是在将这个dict附加到DB之前,我希望清除数据库并避免重复的值(或者在将dict附加到DB之后删除重复的值)

如果我选择删除重复项,我应该从“sale_id”、“name”、“fecha”和“debe”列中删除重复项,而不仅仅是从“sale_id”中删除重复项,因为我得到了许多编号相同但日期不同的“sale_id”(“fecha”)

我尝试过这个方法,但每次运行“objects.create”时,我都会在数据库中得到重复的值:

class Creditos1(models.Model):

    sale_id = models.IntegerField(default=0)
    name = models.CharField(max_length=150)
    fecha = models.DateTimeField(default=datetime.now)
    debe = models.IntegerField(default=0)

for i in range(0,len(h)):
    Creditos1.objects.create(name=h[i]['name'], sale_id=h[i]['sale_id'], fecha=h[i]['fecha'], debe=h[i]['debe'])

非常感谢


Tags: djangonameinid数据库defaultdbdatetime
1条回答
网友
1楼 · 发布于 2024-09-27 19:27:26

每次运行代码时,都会创建新对象,不管它们是否已在数据库中。您没有提供唯一的ID

要删除所有对象,只需运行

Creditos1.objects.all().delete()

要检查数据库中是否已存在数据,以避免多次添加数据,例如,可以使用快捷方式

credit, created = Creditos1.objects.get_or_create(name=..., sale_id=...)

编辑:一些技巧(主题外)

顺便说一句,如果在python中循环列表,则有一种较短的方法:

for item in h:
    Creditos1.objects.create(name=item['name'], sale_id=item['sale_id'] ...)

如果键与要传递的参数完全相同,则可以使用

for item in h:
    Creditos1.objects.create(**item)

综合起来:

运行delete命令或(重新)移动sqlite文件后,应避免多次存储相同的数据

# models.py

class Creditos1(models.Model):
    sale_id = models.IntegerField(default=0)
    name = models.CharField(max_length=150)
    fecha = models.DateTimeField(default=datetime.now)
    debe = models.IntegerField(default=0)


# view or script

sample_dict =  [
{'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 3, 11),
  'debe': 500.0},
 {'sale_id': 14,
  'name': 'Macarena',
  'fecha': datetime.date(2021, 4, 11),
  'debe': 500.0},
 {'sale_id': 15,
  'name': 'Yamila',
  'fecha': datetime.date(2021, 4, 14),
  'debe': 2000.0}
]


for item in sample_dict:
    c, new = Creditos1.objects.get_or_create(**item)
    # optional:
    if not new:
        print("Entry already in the DB:")
        print(c)

相关问题 更多 >

    热门问题