即使在“保存”调用后,Django对象也不能保存

时间:2013-06-25 20:16:06

标签: python sql database django sqlite

我真的很茫然,因为这毫无意义。我调用save / create一个对象,它不会显示在管理站点中。我甚至用SQLite Viewer程序检查了SQLite数据库,再次显示该项目尚未保存。

这是保存Data对象的代码:

        data = Data(represents=field, for_entry=entry, value="This can be anything")
        # field is a DataField db object and entry is a Entry db object (see model below and paragraph)
        print("B4", data) #<---- Shows that Data has not been assigned an ID/pk
        data.save()
        print("8ER: ", data) #<--- Shows that Data has been assigned an ID/pk

从我的评论中可以看出,我知道在save调用之后为Data对象分配了一个ID,我认为这意味着它有效。任何地方都不会抛出错误。 fieldentry都是。[table name].objects.get(id=...)。每个人似乎都没问题,因为他们有正确的ID,使用class Entry(models.Model): parent = models.ForeignKey('Entry', blank = True, null = True, default=None) # The entry this subs. Is left blank for top level entries. id_number = models.CharField(max_length=20) visible = models.BooleanField() data_field = models.ForeignKey('DataField', default=1) # The field that this entire entry falls under. REDUNDANT BUT NECISSARY def __str__(self): return str(self.id)+ "-" + str(self.id_number) class DataField(models.Model): parent = models.ForeignKey('DataField', related_name='parent field', null=True, blank=True, default=1) order = models.IntegerField() multiple_entries = models.BooleanField(default=True) DATA_TYPES = (('t', 'Text'), ('d', 'Date'), ('l', 'List'), ('o', 'Option'), ('b', 'Boolean'), ('f', 'Foreign Key'), ('r', 'Root'), ('bb', 'Branch'), ('i', 'Image'), ('ff', 'File'), ('h', 'Holder'), ('bt', 'Big Text')) # A number means it is a foreign key. Should go off title. foreign_source = models.ForeignKey('DataField', null=True, blank=True) # Points to DATA FIELD WHO'S MATCHING DATA WILL MAKE UP THE OPTIONS data_type = models.CharField(max_length=2, choices=DATA_TYPES, default='t', null=True, blank=True) title = models.CharField(max_length=100, null=True, blank=True) visibility = models.BooleanField(default=False) def __str__(self): return str(self.id) + "-" + str(self.title) def __eq__(self, other): if not isinstance(other, DataField): return False if self.data_type == 'h': return self.title == other.title return self.id == other.id class Data(models.Model): represents = models.ForeignKey('DataField') for_entry = models.ForeignKey('Entry', null=True) value = models.CharField(max_length=1000000) def __str__(self): return self.represents.title + "-" + str(self.for_entry.id) + "-" + str(self.value) + "-" + str(self.id) 检索,我可以保存/编辑它们并保存更改。

甚至很奇怪,在这个函数之前调用的函数中的这个确切代码可以正常工作。

这是我的model.py(我拿出一些函数来缩短它):

{{1}}

我可能会遗漏一些明显的东西,或者您可能需要更多的信息来解决它。如果没有足够的信息,请评论并请求更多信息,或者只列出可能发生的问题。

4 个答案:

答案 0 :(得分:1)

尝试手动提交。我不知道还有什么建议。

from django.db import transaction

@transaction.commit_manually
def viewfunc(request):
    ...
    data.save()
    transaction.commit()

答案 1 :(得分:1)

我在进行单元测试时遇到了类似的问题,并且遇到了一个错误,其中看起来保存方法不起作用 - &gt;如下

p = MyModel.objects.get(pk=myparam)
self.assertEqual(p.my_attr, value) 
myfunc()  # Code that changed the same object p is referencing
self.assertEqual(p.my_attr, new_value)

即使我将被引用的对象更改为新值,然后对该对象执行.save(),上述操作也失败了。

要解决此问题,我必须将p重新分配给MyModel对象。单元测试中的固定代码看起来像这样。

p = MyModel.objects.get(pk=myparam)
self.assertEqual(p.my_attr, value) 
myfunc()  # Code that changed the same object p is referencing
p = MyModel.objects.get(pk=myparam)
self.assertEqual(p.my_attr, new_value)

变量指向内存中的旧位置似乎是一个问题,但我只是在5个月前开始编程所以我有点过头了:)如果有人能解释为什么我真的很感激反馈这种情况正在发生,因为我仍然难倒。

如果你真的不认为save方法正在执行,你可以通过覆盖save方法并添加print语句来进行健全性检查。它可能类似于以下内容:

class MyModel(models.Model):
    attr = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)
        print('Did this attribute update? (attr):', self.attr)
        print('Save method executed!')

编辑:与内存位置理论一致,我做了这个简单的例子:

In [3]: a = 1
In [4]: b = a
In [5]: hex(id(a))
Out[5]: '0x100240280'
In [6]: hex(id(b))
Out[6]: '0x100240280'
In [7]: a = 2
In [8]: b
Out[8]: 1
In [9]: hex(id(a))
Out[9]: '0x1002402a0'
In [10]: hex(id(b))
Out[10]: '0x100240280'

仍然喜欢听到任何想法。

答案 2 :(得分:1)

我有同样的问题。我通过将对象分配给新变量来解决它,进行更改并保存新变量:

    location = self.location  # self.location is set by other methods
    location.is_active = True
    location.save()

答案 3 :(得分:0)

在需要更新的对象中使用django refresh_from_db()函数。