1

我有一个模型,让我们说一下:

class Invoice(models.Model):
    client_name = models.CharField(max_length=100)

我有一个看起来像这样的文件:

def foo_1():
    for inv in Invoice.objects.all():
        inv.client_name = "Joe"
        inv.save()

def foo_2(inv):
    inv.client_name = "Joe"
    inv.save()

测试时出现了我的问题:

class FooCase(TestCase):
    def test_foo(self):
        inv = Invoice("Jack")

        print inv.client_name    # output Jack, OK
        foo_1()
        print inv.client_name    # output Jack, KO !
        print inv.client_name    # output Jack, OK
        foo_2(inv)
        print inv.client_name    # output Joe, OK

我不明白为什么会有两种不同的行为:(

我在我的模型中添加了修改日期,并尝试foo_1在循环之前和之后输出它forsave似乎工作正常,但就像对象不同......

我不知道这是否有帮助,但我也vars(invoice)从输出test_foo,然后从foo_1(),最后从foo_2(). ( )中的状态相同test_foo,但foo_2()( )中的状态不同<django.db.models.base.ModelState object at 0x32ca090>foo_1()<django.db.models.base.ModelState object at 0x32cc650>

4

3 回答 3

4

每次从数据库中检索记录时,Django 都会返回一个不同的对象:

>>> i1 = Invoice.objects.all()[0]
>>> i2 = Invoice.objects.get(pk=i1.pk)
>>> i1 == i2
True // since model instances compare by their id field only
>>> id(i1) == id(i2)
False // since they are actually separate instances

inv = Invoice("Jack")您在调用之前进行实例化foo_1,因此在foo_1更新所有发票之后,您仍然拥有inv尚未更新的旧实例(因为foo_1实例化其模型对象本身,它们是单独的实例并且不影响inv)并且尚未从数据库中重新加载—尽管数据库inv.client_name中的记录已更新,但没有任何修改。,另一方面,适用于您作为参数传递的特定实例,因此您会看到更改的; 即使您不保存实例,您实际上也会看到这种变化。foo_2client_name

于 2014-02-26T17:08:02.097 回答
1

保存时,Jack 并未保存在数据库中。您尚未为数据库创建对象以供您的查询进行迭代。但是,您确实有一个可以传递的 obj。这就是为什么您可以更改对象属性并保存它们的原因。

于 2014-02-26T17:03:57.927 回答
0

您的 inv 对象存储在本地,因此在第一个实例中没有更改。如果您希望继续使用该对象,只需从数据库中刷新该对象以获取保存的最新属性。

print inv.client_name
foo_1()
inv.refresh_from_db()
print inv.client_name
于 2020-07-07T00:29:31.280 回答