Django(或sqlite3)更改mod的属性序列

2024-10-01 00:34:38 发布

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

我将django与sqlite3一起使用,下面是我的models.py

from django.db import models
from django.conf import settings
from django.utils import timezone

class VoterDetails(models.Model):
    number = models.CharField(max_length=200,null=True)
    voter_id = models.CharField(null=True,max_length=200)
    elector_name = models.CharField(max_length=200,null=True)
    father_or_husband_name = models.CharField(max_length=200,null=True)
    has_husband = models.CharField(max_length=200,null=True)
    house_no = models.CharField(max_length=200,null=True)
    age = models.CharField(max_length=200,null=True)
    sex = models.CharField(max_length=6,null=True)
    ac_name = models.CharField(max_length=200,null=True)
    parl_constituency = models.CharField(max_length=200,null=True)
    part_no = models.CharField(max_length=200,null=True)
    year = models.CharField(max_length=200,null=True)
    state = models.CharField(max_length=200,null=True)
    filename = models.CharField(max_length=200,null=True)
    main_town = models.CharField(max_length=200,null=True)
    police_station = models.CharField(max_length=200,null=True)
    mandal = models.CharField(max_length=200,null=True)
    revenue_division = models.CharField(max_length=200,null=True)   
    district = models.CharField(max_length=200,null=True)
    pin_code = models.CharField(max_length=200,null=True) 
    polling_station_name = models.CharField(max_length=200,null=True)
    polling_station_address = models.CharField(max_length=200,null=True)
    net_electors_male = models.CharField(max_length=200,null=True)
    net_electors_female = models.CharField(max_length=200,null=True) 
    net_electors_third_gender = models.CharField(max_length=200,null=True)
    net_electors_total = models.CharField(max_length=200,null=True)
    change = models.CharField(default="",max_length=200,null=True)

    def __str__(self):
        return self.elector_name

正如我们所看到的,没有一个属性可以声称是主键。在本例中,django生成一个属性id,它是一个自动递增的Auto field,被选为主键

我进行了迁移,然后检查了由此生成的表temp_voterdetails的模式。(temp是我的应用程序的名称。)

sqlite> .schema temp_voterdetails
CREATE TABLE IF NOT EXISTS "temp_voterdetails" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"age" varchar(200) NULL,
"ac_name" varchar(200) NULL,
"change" varchar(200) NULL,
"district" varchar(200) NULL, 
"elector_name" varchar(200) NULL, 
"father_or_husband_name" varchar(200) NULL, 
"filename" varchar(200) NULL, 
"has_husband" varchar(200) NULL, 
"main_town" varchar(200) NULL, 
"mandal" varchar(200) NULL, 
"net_electors_female" varchar(200) NULL, 
"net_electors_male" varchar(200) NULL, 
"net_electors_third_gender" varchar(200) NULL, 
"net_electors_total" varchar(200) NULL, 
"number" varchar(200) NULL, 
"pin_code" varchar(200) NULL, 
"police_station" varchar(200) NULL, 
"polling_station_address" varchar(200) NULL, 
"polling_station_name" varchar(200) NULL, 
"revenue_division" varchar(200) NULL, 
"sex" varchar(6) NULL, 
"state" varchar(200) NULL, 
"voter_id" varchar(200) NULL, 
"year" varchar(200) NULL, 
"house_no" varchar(200) NULL, 
"parl_constituency" varchar(200) NULL, 
"part_no" varchar(200) NULL);

如您所见,属性的顺序是按字母顺序排列的,因此更改了models.py文件中属性声明的原始顺序

撇开这件事不谈,我尝试通过以下方式导入CSV(遵循models.py文件中定义的结构):

.mode csv
.separator ","
.import /path/to/my/csv temp_voterdetails 

然后我得到错误(显然是行数的倍数):

INSERT failed: UNIQUE constraint failed: temp_voterdetails.id
/path/to/my/csv:164705: expected 28 columns but found 27 - filling the rest with NULL

所以,最初我认为我没有为“id”提供任何输入,所以它必须是自动生成的,因此应该不会使UNIQUE约束失败。但遗憾的是,对于django到sqlite3转换的字母顺序混乱,id似乎是从number输入的,最后只剩下一列。因此,UNIQUE约束失败,最后一列未使用

如何确保我创建的表的模式设计正确,并且与models.py中定义的模型相同?


更新:停止自动按字母顺序排列属性后,我将在末尾添加一个属性global_number(自动递增,主键)。所有其他属性都可能与现有的27个列标题匹配,最后一个属性由于不在CSV文件中,将自动生成,从而生成我的主键

这就是我的计划。如果这是错误的,请纠正我



Tags: djangonameidtruenet属性modelsnull
1条回答
网友
1楼 · 发布于 2024-10-01 00:34:38

在sqlite3模型中,属性似乎总是按字母顺序排列的,因此我们无法使用sqlite3直接导入csv。我面临的主要问题是向表中添加行的速度太慢。这是因为我每行添加一个查询。这可以通过创建条目对象列表并将其批量添加到表中来轻松解决。这只需要一个查询,因此所需的时间要少得多。代码如下:

import os
import django
os.environ['DJANGO_SETTINGS_MODULE']='<your-site>.settings'
django.setup()
from temp.models import <your-model>
import csv
with open('/path/to/csvfile','r') as f:
    reader = csv.reader(f)
    lst = []
    for i,row in enumerate(reader):
        print('Adding :'+str(i))
        if(i!=0):
            lst.append(<your-model>(
                name = row[0], #attribute 1
                popularity = row[1], #attribute 2
                ssum = row[2], # attribute 3
                yearrange = row[3], #attribute 4
                state = row[4] # attribute 5
                ))
    <your-model>.objects.bulk_create(lst)

相关问题 更多 >