我有模型,Match
,有两个外键:列表更改
class Match(model.Model):
winner = models.ForeignKey(Player)
loser = models.ForeignKey(Player)
当我遍历Match
我发现每个模型实例使用唯一的对象为外键。这最终咬我,因为它引入了矛盾,这里有一个例子:
>>> def print_elo(match_list):
... for match in match_list:
... print match.winner.id, match.winner.elo
... print match.loser.id, match.loser.elo
...
>>> print_elo(teacher_match_list)
4 1192.0000000000
2 1192.0000000000
5 1208.0000000000
2 1192.0000000000
5 1208.0000000000
4 1192.0000000000
>>> teacher_match_list[0].winner.elo = 3000
>>> print_elo(teacher_match_list)
4 3000 # Object 4
2 1192.0000000000
5 1208.0000000000
2 1192.0000000000
5 1208.0000000000
4 1192.0000000000 # Object 4
>>>
我解决了这个问题,像这样:
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
我的问题:是否有解决问题的方式更优雅通过使用QuerySet而不需要在任何时候调用保存?如果没有,我想让解决方案更通用:如何获得模型实例的外键列表,或者您是否有更好的通用解决方案来解决我的问题?
如果您认为我不明白为什么会发生这种情况,请纠正我。
这是一个众所周知的事情(或发行一些)。用django-idmapper来看看答案。 – 2011-01-27 00:02:53