Python Django测试-我可以';当我使用queryset获取对象时,无法保存它

Python Django测试-我可以';当我使用queryset获取对象时,无法保存它,python,django,testing,state,django-unittest,Python,Django,Testing,State,Django Unittest,我有一个模型,比如说: 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 = "Jo

我有一个模型,比如说:

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
save
似乎工作正常,但似乎对象不同


我不知道这是否有帮助,但我也从
test\u foo
输出
vars(invoice)
,然后从
foo\u 1()
输出,最后从
foo\u 2()
输出。在
test\u foo
foo\u 2()
)中的状态相同,但在
foo\u 1()
/code>)中的状态不同

保存Jack时,它不会保存在数据库中。您还没有为数据库创建对象以供查询迭代。但是,您确实有一个可以传递的对象。这就是为什么您可以更改“对象”属性并保存它们。

保存Jack时,它不会保存在数据库中。您还没有为数据库创建对象r查询进行迭代。但是,您确实可以传递一个obj。这就是为什么您可以更改“对象”属性并保存它们。

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

在调用
foo_1
之前实例化
inv=Invoice(“Jack”)
,因此在
foo_1
更新所有发票之后,您仍然拥有旧的
inv
实例,该实例尚未更新(因为
foo_1
实例化了其模型对象本身,这些对象是单独的实例,不会影响
inv
)并且没有从数据库中重新加载-虽然数据库中的记录已经更新,但没有任何内容被修改。
inv.client_name
。另一方面,
foo_2
,在作为参数传递的特定实例上工作,因此您可以看到更改的
client_name
;即使您不要保存实例。

每次从数据库检索记录时,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

在调用
foo_1
之前实例化
inv=Invoice(“Jack”)
,因此在
foo_1
更新所有发票之后,您仍然拥有旧的
inv
实例,该实例尚未更新(因为
foo_1
实例化了其模型对象本身,这些对象是单独的实例,不会影响
inv
)并且没有从数据库中重新加载-虽然数据库中的记录已经更新,但没有任何内容被修改。
inv.client_name
。另一方面,
foo_2
,在作为参数传递的特定实例上工作,因此您可以看到更改的
client_name
;即使您不要保存实例。

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

print inv.client_name
foo_1()
inv.refresh_from_db()
print inv.client_name

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

print inv.client_name
foo_1()
inv.refresh_from_db()
print inv.client_name

它会给您带来什么错误?或者它只是没有将其保存到数据库中?哦,而且
inv=Invoice(“Jack”)
在您运行
inv.save()
之前不会在数据库中,因此它不会受到
foo_1()的影响
。我还非常感兴趣的是,最终的
inv.client\u name
输出是
Joe
它似乎应该是
LOL
inv
不会受到
foo\u 1
的影响,即使它是在调用
foo\u 1
之前保存的。它会给你什么错误?或者它只是没有保存到数据库?哦,还有
 inv=Invoice(“Jack”)
在运行
inv.save()
之前不会在数据库中,因此它不会受到
foo_1()的影响
。我还非常感兴趣的是,最终的
inv.client\u name
输出是
Joe
,看起来应该是
LOL
inv
不会受到
foo\u 1
的影响,即使它是在调用
foo\u 1
之前保存的。