我想了解这种完全出乎意料的行为变化的原因以及如何实施。我来自JS世界,这很可能无法以任何方式实现..
通过遍历对象来调用fn会得到与首次将此对象分配给新变量时不同的结果:
>>> from core.models import SomeModel
>>> s = SomeModel.objects.get(id=45)
>>> s.user.profile.needs_review
True
>>> s.user.profile.needs_review = False
>>> s.user.profile.needs_review
True
>>> profile = s.user.profile
>>> profile.needs_review
True
>>> profile.needs_review = False
>>> profile.needs_review
False
这真的令人不安,因为在任何与我合作过的语言中都会这样做。
顺便说一句,这是一个常规的django模型,但我更有兴趣知道可以使用哪种语言资源来实现这种效果。为了更好地解释我为什么会这样做,我试图通过以下方式对profile
模型进行常规保存:
streamer.user.profile.needs_review = True
streamer.user.profile.save()
它并没有奏效,但正在做:
profile = streamer.user.profile
profile.needs_review = True
profile.save()
工作得很好。
答案 0 :(得分:1)
如果对模型对象进行更改,则必须保存模型对象,否则无法反映。
>>> s.user.profile.needs_review = False
>>> s.save()
>>> s.user.profile.needs_review
False
以下一行
>>> profile = s.user.profile
>>> profile.needs_review
True
它不会从数据库加载新数据这就是您看到此行为的原因
答案 1 :(得分:1)
关于允许此行为的python语言资源,您可以检查:
https://docs.python.org/3/library/functions.html#property
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
基本上,django使用它来抽象数据库查询,并且在示例中不像常规对象那样。