执行转储数据时对“错误:无法序列化数据库:”进行故障排除
Posted
技术标签:
【中文标题】执行转储数据时对“错误:无法序列化数据库:”进行故障排除【英文标题】:Troubleshooting "Error: Unable to serialize database:" when performing dumpdata 【发布时间】:2011-10-04 13:10:51 【问题描述】:由于某些原因,今天我无法使用python manage.py dumpdata
或从可以下载 mysql 文件的链接转储我的数据库。
我尝试使用python manage.py dumpdata --traceback
,这是我掌握的信息。
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
utility.execute()
File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/dumpdata.py", line 114, in handle
use_natural_keys=use_natural_keys)
File "/usr/local/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize
s.serialize(queryset, **options)
File "/usr/local/lib/python2.7/site-packages/django/core/serializers/base.py", line 48, in serialize
self.handle_fk_field(obj, field)
File "/usr/local/lib/python2.7/site-packages/django/core/serializers/python.py", line 48, in handle_fk_field
related = getattr(obj, field.name)
File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 301, in __get__
raise self.field.rel.to.DoesNotExist
django.contrib.auth.models.DoesNotExist
上面写着django.contrib.auth.models.DoesNotExist
。我想知道它是否与外键或其他东西有关。
models.py
class Client(models.Model):
name = models.CharField(max_length = 40)
telephone = models.CharField(max_length = 20)
website = models.URLField(verify_exists = False)
fax = models.CharField(max_length = 20)
email = models.EmailField()
is_active = models.BooleanField()
user = models.ForeignKey(User)
datetime = models.DateTimeField(default=datetime.now)
note = models.TextField()
def __unicode__(self):
return self.name
在我的 models.py 中,最近添加了字段用户、日期时间和注释。现在,如果对于客户,这些字段中的任何一个都没有值,即空白,我将收到错误 Unable to serialize database
。
当我在 mysql 中查找用户、日期时间和注释时。 Client 的表显示了 user_id、datetime 和 note 以具有 Null 值(这是我想要的)。为什么它不允许 Null 值?
+-----------+-------------+------+-----+--------- +----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-----------+-------------+------+-----+--------- +----------------+ |编号 |整数(11) |否 |优先级 |空 |自动增量 | |姓名 | varchar(40) |否 | |空 | | |电话 | varchar(20) |否 | |空 | | |网站 | varchar(200) |否 | |空 | | |传真 | varchar(20) |否 | |空 | | |电子邮件 | varchar(75) |否 | |空 | | | is_active |小整数(1) |否 | |空 | | |用户 ID |整数(11) |是 |穆尔 |空 | | |日期时间 |日期时间 |是 | |空 | | |注意 |长文 |是 | |空 | | +-----------+-------------+------+-----+--------- +----------------+【问题讨论】:
外键问题听起来不错。您的任何模型都有指向django.contrib.auth.models
中模型的 ForeignKey 字段?
我第二个@tcarobruce。这听起来像是外键或约束问题。由于缺少 South 或手动未正确修改的键或约束,我遇到过类似的情况。
self.handle_fk_field(obj, field)
有点赠品
正如其他人所说,您的表中很可能缺少一些外键元素。我也遇到过这个问题。您始终可以从另一个模型转储数据,以查看此问题是否仅针对一个模型。
【参考方案1】:
您需要告诉 Django,它应该允许在最近添加的字段上使用 NULL 值。它只查看字段定义,不从数据库中获取模式。
self.field.rel.to.DoesNotExist
错误最有可能在客户端没有关联用户并且访问 client.user
时引发。这是因为默认情况下所有字段都是必需的。如果您更改模型定义,如下所示,错误应该会消失。
class Client(models.Model):
# ...
user = models.ForeignKey(User,
null=True, blank=True)
datetime = models.DateTimeField(default=datetime.now,
null=True, blank=True)
note = models.TextField(null=True, blank=True)
null=True
允许 NULL
和 None
字段上的值。
blank=True
允许您在模型表单中将该字段留空
(例如,在管理员中)。
(blank
和null
默认都是False
)
【讨论】:
以上是关于执行转储数据时对“错误:无法序列化数据库:”进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章