ValueError:无法添加 *:实例在数据库“默认”上,值在数据库“无”上
Posted
技术标签:
【中文标题】ValueError:无法添加 *:实例在数据库“默认”上,值在数据库“无”上【英文标题】:ValueError: Cannot add *: instance is on database "default", value is on database "None" 【发布时间】:2011-12-11 19:54:36 【问题描述】:In [1]: from editor.models import *
In [4]: from subscriptions.models import *
In [5]: template = StockTemplate.objects.create(name='Template 1')
In [6]: template
Out[6]: <StockTemplate: Template 1>
In [7]: plan = SubscriptionPlan.objects.create(name='Bronze')
In [8]: plan
Out[8]: <SubscriptionPlan: Bronze>
In [12]: plan.templates.add(template)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/home/me/GitProjects/test_git/proj/<ipython console> in <module>()
/home/me/GitProjects/test_git/django-trunk/django/db/models/fields/related.pyc in add(self, *objs)
498 if rel.through._meta.auto_created:
499 def add(self, *objs):
--> 500 self._add_items(self.source_field_name, self.target_field_name, *objs)
501
502 # If this is a symmetrical m2m relation to self, add the mirror entry in the m2m table
/home/me/GitProjects/test_git/django-trunk/django/db/models/fields/related.pyc in _add_items(self, source_field_name, target_field_name, *objs)
558 if not router.allow_relation(obj, self.instance):
559 raise ValueError('Cannot add "%r": instance is on database "%s", value is on database "%s"' %
--> 560 (obj, self.instance._state.db, obj._state.db))
561 new_ids.add(obj.pk)
562 elif isinstance(obj, Model):
ValueError: Cannot add "<StockTemplate: Template 1>": instance is on database "default", value is on database "None"
模型
6 class SubscriptionPlan(models.Model):
7 name = models.CharField(max_length=255)
8 templates = models.ManyToManyField(StockTemplate)
9 monthly_fee = models.IntegerField("Monthly Fee", max_length=16, default="0")
10 modified = models.DateTimeField(auto_now=True, editable=False)
11 created = models.DateTimeField(auto_now_add=True, editable=False)
12
13 def __unicode__(self):
14 return "%s" % self.name
18 class StockTemplate(IKImage):
19 name = models.TextField()
20 description = models.TextField(blank=True)
21
22 is_public = models.BooleanField(default=True)
23
24 html = models.FileField(upload_to='stock_templates/html/', \
25 help_text='The file that will be used to render.')
26 #css = models.FileField(upload_to='stock_templates/css/', blank=True)
27
28 img = models.ImageField(upload_to='stock_templates/img/')
29
30 modified = models.DateTimeField(auto_now=True)
31 created = models.DateTimeField(auto_now_add=True)
32
33 objects = StockTemplateManager()
34
35 class IKOptions:
36 spec_module = 'editor.specs'
37 cache_dir = 'stock_templates/img/specs/'
38 image_field = 'img'
39
40 def __unicode__(self):
41 return u"%s" % self.name
42
43 def get_absolute_url(self):
44 return reverse('preview_stock', args=[self.id])
这与 StockTemplate 是一个 IKImage 对象这一事实有关吗?
【问题讨论】:
【参考方案1】:这里的问题是,在将模板添加到产品之前,您需要为这两个对象调用方法save
:
template.save()
plan.save()
plan.templates.add(template)
如果这些对象都没有 id(plan
和 template
),则 Django 无法添加它
【讨论】:
【参考方案2】:此错误的一个非常常见的原因是您尝试在保存(父)对象之前添加关系。首先,保存对象,然后添加关系。希望能得到解决。
例子:
a1 = Article(headline='Django lets you build Web apps easily')
现在,如果你直接尝试添加这样的关系:
a1.publications.add(p1)
会报错。
解决方法:先保存再添加关系!!
a1.save()
a1.publications.add(p1)
这将完美无缺。
Docs
【讨论】:
以上是关于ValueError:无法添加 *:实例在数据库“默认”上,值在数据库“无”上的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:无法分配“'interests': ['Technology', 'Sports', 'Health'] “Consumer.interests”必须是“Interests”实例
如何将 RGB ImageItem 添加到 pyqtgraph ViewBox? ValueError:无法将输入数组从形状(256,256,4)广播到形状(256,256)
ValueError:无法将大小为0的序列复制到维度为56的数组轴