簡體   English   中英

Django(或sqlite3)更改模型屬性的順序

[英]Django (or sqlite3) change(s) the sequence of attributes of a model

我在sqlite3中使用django ,這是我的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 (AUTO INCREMENT,主鍵)。 所有其他屬性都可能與現有的27個列標題匹配,並且最后一個屬性(由於CSV文件中不存在)將自動生成,從而生成我的主鍵。

這是我的計划。 如果這有任何錯誤,請糾正我。


在sqlite3模型中,屬性似乎總是​​按字母順序排列,因此,我們無法使用sqlite3直接導入csv。 我面臨的主要問題是向表中添加行的速度較慢。 這是因為我在每行添加中執行1個查詢。 通過制作條目對象列表並將其批量添加到表中,可以輕松解決此問題。 這僅需要單個查詢,因此花費的時間要少得多。 這是代碼:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM