我有很多外国关键定义的问题,我将inspectdb
'D带入我的型号。
我有一组我想将其纳入Django应用程序的旧表,所以我运行了python manage.py inspectdb > models.py
我想在应用程序中使用7个GPS表。查看其中的两个将充分描述我遇到的问题。
mysql创建表语句:
CREATE TABLE `gps` (
`longitude_dir` char(1) DEFAULT NULL,
`longitude` decimal(8,5) DEFAULT NULL,
`latitude` decimal(7,5) DEFAULT NULL,
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`host_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`latitude_dir` char(1) DEFAULT NULL,
`host` varchar(24) NOT NULL,
`altitude_units` char(1) DEFAULT NULL,
`gps_time` datetime DEFAULT NULL,
`raw` blob NOT NULL,
`clean` bit(1) DEFAULT NULL,
`data_valid` bit(1) DEFAULT NULL,
`modem` varchar(15) NOT NULL,
`altitude` decimal(7,2) DEFAULT NULL,
PRIMARY KEY (`id`,`host`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
CREATE TABLE `gps_zda` (
`local_zone_minutes` tinyint(4) DEFAULT NULL,
`host` varchar(24) NOT NULL,
`year` tinyint(4) DEFAULT NULL,
`day` tinyint(4) DEFAULT NULL,
`month` tinyint(4) DEFAULT NULL,
`local_zone` tinyint(4) DEFAULT NULL,
`gps_id` int(10) unsigned NOT NULL,
`timestamp` time DEFAULT NULL,
KEY `gps_fk_zda` (`gps_id`,`host`),
CONSTRAINT `gps_fk_zda` FOREIGN KEY (`gps_id`, `host`) REFERENCES `gps` (`id`, `host`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
这是模型的子集
from __future__ import unicode_literals
from django.db import models
class Gps(models.Model):
longitude_dir = models.CharField(max_length=1, blank=True, null=True)
longitude = models.DecimalField(max_digits=8, decimal_places=5, blank=True, null=True)
latitude = models.DecimalField(max_digits=7, decimal_places=5, blank=True, null=True)
id = models.AutoField()
host_time = models.DateTimeField()
latitude_dir = models.CharField(max_length=1, blank=True, null=True)
host = models.CharField(max_length=24)
altitude_units = models.CharField(max_length=1, blank=True, null=True)
gps_time = models.DateTimeField(blank=True, null=True)
raw = models.TextField()
clean = models.TextField(blank=True, null=True) # This field type is a guess.
data_valid = models.TextField(blank=True, null=True) # This field type is a guess.
modem = models.CharField(max_length=15)
altitude = models.DecimalField(max_digits=7, decimal_places=2, blank=True, null=True)
class Meta:
managed = False
db_table = 'gps'
unique_together = (('id', 'host'),)
class GpsZda(models.Model):
local_zone_minutes = models.IntegerField(blank=True, null=True)
host = models.ForeignKey(Gps, db_column='host')
year = models.IntegerField(blank=True, null=True)
day = models.IntegerField(blank=True, null=True)
month = models.IntegerField(blank=True, null=True)
local_zone = models.IntegerField(blank=True, null=True)
gps = models.ForeignKey(Gps)
timestamp = models.TimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'gps_zda'
1。因此,我尝试使用python manage.py makemigrations
时遇到的第一个问题是(gps.id, gps.host)
未正确定义为主要键。实际上,似乎许多相反被忽略了。首先,我收到一个错误,说gps.id被定义了两次。
更改
id = models.Autofield()
...
host = models.CharField(max_length=24)
to
id = models.Autofield(primary_key=True)
...
host = models.CharField(primary_key=True, max_length=24)
让Django知道不要创建自己的ID字段。我仍然不确定它是否正确处理共享密钥。
2。由于GPS_ZDA表具有共享,独特的外键,因此出现了第二个问题。Django抱怨说,它不知道该命名第二个外键。
在其中一个外国钥匙中添加related_name
似乎停止了投诉。
我更改了
host = models.ForeignKey(Gps, db_column='host')
to
host = models.ForeignKey(Gps, db_column='host', related_name='gps_zda_host_fk')
我再次不确定是否正确处理共享的外键。
3。为了进行一些测试,我决定将模型添加到Admin.py并查看字段是否正确填充。
这导致发现更多问题。
问题3。当我打开gps object
时,我看到位字段(gps.clean,gps.data_valid)被转换为Textfields。我尝试通过简单地将TextField
更改为NullBooleanField
来快速解决这些问题。现在,在管理页面上,我看到了一个适当的下拉列表,其中包括:未知,是,否。不幸的是,现有的1个位值正在解决为未知。
我不确定如何解决这个问题,尝试更改数据库结构是有问题的。
4。再次在管理员中,我无法正确加载gps_zda对象。首先,我有一个错误抱怨不存在的gps_zda.id列。我能够通过更改
来解决这个问题host = models.ForeignKey(Gps, db_column='host', related_name='gps_zda_host_fk')
...
gps = models.ForeignKey(Gps)
to
host = models.ForeignKey(Gps, primary_key=True, db_column='host', related_name='gps_zda_host_fk')
...
gps = models.ForeignKey(Gps, primary_key=True)
让django知道不要寻找gps_zda.id字段。
我还添加了`kpszda的类meta。
但是,我仍然无法通过管理页面查看GPS_ZDA数据。我收到以下错误gps zda object with primary key u'Arthur' does not exist.
,其中Arthur
是有效的GPS. -HOST值。
当我开始看Django时,我认为这会很有趣。没那么多。我真的质疑将任何现有数据库移动到Django项目中的可行性。
这是我当前的模型。关于我如何使它们更好地使用我的桌子工作的任何建议都将受到欢迎。
class Gps(models.Model):
longitude_dir = models.CharField(max_length=1, blank=True, null=True)
longitude = models.DecimalField(max_digits=8, decimal_places=5, blank=True, null=True)
latitude = models.DecimalField(max_digits=7, decimal_places=5, blank=True, null=True)
id = models.AutoField(primary_key=True)
host_time = models.DateTimeField(primary_key=True)
latitude_dir = models.CharField(max_length=1, blank=True, null=True)
host = models.CharField(primary_key=True, max_length=24)
altitude_units = models.CharField(max_length=1, blank=True, null=True)
gps_time = models.DateTimeField(blank=True, null=True)
raw = models.TextField()
clean = models.NullBooleanField(null=True) # This field type is a guess.
data_valid = models.NullBooleanField(null=True) # This field type is a guess.
modem = models.CharField(max_length=15)
altitude = models.DecimalField(max_digits=7, decimal_places=2, blank=True, null=True)
class Meta:
managed = False
db_table = 'gps'
unique_together = (('id', 'host'),)
class GpsZda(models.Model):
local_zone_minutes = models.IntegerField(blank=True, null=True)
host = models.ForeignKey(Gps, db_column='host', related_name='gps_zda_host_fk')
year = models.IntegerField(blank=True, null=True)
day = models.IntegerField(blank=True, null=True)
month = models.IntegerField(blank=True, null=True)
local_zone = models.IntegerField(blank=True, null=True)
gps = models.ForeignKey(Gps, primary_key=True, unique=True)
timestamp = models.TimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'gps_zda'
unique_together = (('gps', 'host'),)
django当前不支持表中的复合主键。(请参阅Wiki页面以及缺少模型元选项,这是将定义的位置。)
最好的选择可能是在gps
表中添加另一个标识列,以便Django可以正确使用。
关于其他问题,如果您为他们进行研究和发表单独的问题,最好是最好的。