我有模型,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