【问题标题】:Django models - foreign key object date rewritingDjango 模型 - 外键对象日期重写
【发布时间】:2012-11-29 00:03:27
【问题描述】:

我有这样的情况:

型号:

class Test2(models.Model) {
  date = models.DateField(editable=False)
}

class Test(models.Model) {
  test2 = models.ForeignKey(Test2)
}

行动:

for test_obj in Test.objects.all():
  test2_obj = test_obj.test2
  test2_obj.date = date.today()
  test2_obj.save()
  test_obj.save()

在该操作之后,test2_obj 的日期不会更改。为什么? test2_obj = test_obj.test2 是副本吗?

【问题讨论】:

  • 你能展示让你相信它没有改变的测试代码吗?
  • 从 app_test2 中选择 *; :)
  • 删除test_obj.save()这一行
  • 在实际情况下我需要那条线。有问题吗?也许我应该在第一次保存之前移动它?

标签: python django foreign-keys models django-queryset


【解决方案1】:

我创建 testapp 并测试你的问题

models.py

from django.db import models

class Test2(models.Model):
    date = models.DateField(editable=False)

class Test(models.Model):
    test2 = models.ForeignKey(Test2)

tests.py

from django.test import TestCase
from models import Test, Test2

from datetime import datetime, date

class SimpleTest(TestCase):
    def test_field_update(self):
        old_date = date(2012,11,11)
        current_date = datetime.today().date()

        t2 = Test2(date = old_date)
        t2.save()

        t1 = Test(test2 = t2)
        t1.save()


        for test_obj in Test.objects.all():
            test2_obj = test_obj.test2
            test2_obj.date = current_date
            test2_obj.save()
            test_obj.save()

        t2 = Test2.objects.all()[0]

        self.assertEqual(t2.date, current_date)

运行测试

..>manage.py 测试测试应用程序

为别名'default'创建测试数据库...。 -------------------------------------------------- -------------------- 在 0.016 秒内运行 1 次测试

OK 正在销毁别名 'default' 的测试数据库...

所以你这是按预期工作,而不是你发布的那样。

【讨论】:

  • 我不想回答怎么做,因为我知道。我想知道为什么会这样。
  • 向您展示完整的代码,正如我在回答中所写的,它应该按预期工作,而不是您发布的那样
猜你喜欢
  • 2015-06-21
  • 2021-10-30
  • 1970-01-01
  • 2013-02-07
  • 2011-05-10
  • 2015-05-25
  • 2017-07-27
  • 1970-01-01
  • 2023-01-02
相关资源
最近更新 更多