<p>我有一个模型,<code>Match</code>,有两个外键:</p>
<pre><code>class Match(model.Model):
winner = models.ForeignKey(Player)
loser = models.ForeignKey(Player)
</code></pre>
<p>当我循环<code>Match</code>时,我发现每个模型实例都为外键使用一个唯一的对象。这最后咬了我,因为它引入了不一致性,下面是一个例子:</p>
^{pr2}$
<p>我是这样解决这个问题的:</p>
<pre><code>def unify_refrences(match_list):
"""Makes each unique refrence to a model instance non-unique.
In cases where multiple model instances are being used django creates a new
object for each model instance, even if it that means creating the same
instance twice. If one of these objects has its state changed any other
object refrencing the same model instance will not be updated. This method
ensure that state changes are seen. It makes sure that variables which hold
objects pointing to the same model all hold the same object.
Visually this means that a list of [var1, var2] whose internals look like so:
var1 --> object1 --> model1
var2 --> object2 --> model1
Will result in the internals being changed so that:
var1 --> object1 --> model1
var2 ------^
"""
match_dict = {}
for match in match_list:
try:
match.winner = match_dict[match.winner.id]
except KeyError:
match_dict[match.winner.id] = match.winner
try:
match.loser = match_dict[match.loser.id]
except KeyError:
match_dict[match.loser.id] = match.loser
</code></pre>
<p>我的问题:有没有一种方法可以更优雅地通过使用QuerySets来解决这个问题,而不需要在任何时候调用save?如果没有,我想让解决方案更通用:如何获得模型实例上的外键列表,或者您有更好的通用解决方案来解决我的问题?在</p>
<p>如果你认为我不明白为什么会这样,请纠正我。在</p>