【问题标题】:Django (1.6.3) Model.save() method not workingDjango (1.6.3) Model.save() 方法不起作用
【发布时间】:2015-09-18 13:52:00
【问题描述】:

我有以下 django 模型(使用 managed=False)。

class MyModel(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=250)
    description = models.TextField()
    client = models.ForeignKey(Client)
    created_on = models.DateTimeField(null=True, blank=True)
    user = models.ForeignKey(User, related_name='user')
    last_modified_by = models.ForeignKey(User, related_name='last_modified_by', null=True)
    last_modified_on = models.DateTimeField(null=True, blank=True)

    class Meta:
        managed = False

当我执行'python manage.py shell'并输入以下两条语句时,我可以看到mysql db中添加的行。

>>> dm = MyModel(name='name1', description='test1', client_id=6,user_id=9,last_modified_by_id=9)
>>> dm.save()

但是当我运行服务器“python manage.py runserver”并在类方法中执行相同的语句时,save() 会通过,但数据库中没有添加新行。

    def funcname(self, request):
        print("Creating new row...")
        self.var = MyModel(name='testName',description='testDescription',client_id=6, user=9, last_modified_by=9)
        self.var.save()
        print("Created new row')

观察:

  • 这两个打印语句确实会打印在控制台上。但是数据库中没有条目。

  • funcname() 中没有错误/异常。

  • 尝试为差异列提供唯一条目。结果一样

  • 在函数开头使用 pdb.set_trace() 运行服务器时,发现 MyModel.objects.filter() 给出了正确的行数。但是在数据库中查看时这个数字不匹配。

    (Pdb) MyModel.objects.filter()

    显示 2 个 MyModel 对象的列表。

但是登录DB查看时,对应的表只有1行。

使用 Python 2.7

对可能发生的事情有任何指示吗?

提前致谢!

【问题讨论】:

  • 你能在保存完成后尝试打印print(self.var.id)吗?
  • 是的。它会正确打印 id。
  • 您确定您使用的是正确的数据库而不是 sqlite 数据库吗?
  • 是的,它是正确且相同的 mysql 数据库。正如我所提到的,当我使用“python manage.py shell”时,我可以看到插入的新行。这里肯定有些奇怪。

标签: django python-2.7 django-models


【解决方案1】:

您的主键是一个 IntegerField,这意味着 Django 不知道它应该自动递增。因此它不会自动设置值。

更改定义以改用 AutoField。

【讨论】:

【解决方案2】:

你可以这样做

    def funcname(self, request):
        self.var = MyModel.objects.create(name='testName',description='testDescription',client_id=6, user=9, last_modified_by=9)

Daniel 评论了 Django 自动添加的 id/pk 字段,因此无需重新声明该字段。

【讨论】:

    【解决方案3】:

    再挖掘了一下,我发现在调用者的某个地方,使用了transaction.atomic装饰器。这导致写入 db 表失败。我在这里更新此内容,希望这对将来的人有所帮助。

    感谢所有回复的人。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2022-07-27
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多