您有幾個選擇如何解決這個問題。我將專注於捅代碼的問題,因爲我已經用django內部的東西去了一段時間。
我在下面的鏈接中包含了相關代碼。請注意,我刪除了不相關的部分。另請注意,您將要編輯的部分是您的案例需要重構。
請遵循以下算法,直到您滿意爲止。
- 重構
if
聲明取決於(一個或多個)單獨函數的字段。
- 添加檢查代碼,直到找出哪些字段對應於一般關係。
- 添加提取代碼,直到遵循泛型關係。
測試。
def handle_models(self, models, **options):
# SNIP handle options
all = objects
if propagate:
collected = set([(x.__class__, x.pk) for x in all])
while objects:
related = []
for x in objects:
if DEBUG:
print "Adding %s[%s]" % (model_name(x), x.pk)
# follow forward relation fields
for f in x.__class__._meta.fields + x.__class__._meta.many_to_many:
# YOU CASE HERE
if isinstance(f, ForeignKey):
new = getattr(x, f.name) # instantiate object
if new and not (new.__class__, new.pk) in collected:
collected.add((new.__class__, new.pk))
related.append(new)
if isinstance(f, ManyToManyField):
for new in getattr(x, f.name).all():
if new and not (new.__class__, new.pk) in collected:
collected.add((new.__class__, new.pk))
related.append(new)
# SNIP
objects = related
all.extend(objects)
# SNIP serialization
請編輯問題,包括相關的源。我不打算通過點擊訪問其他網站來查看你在說什麼,對於有同樣問題的人來說,以這種方式發現這個問題更加困難。 – 2011-05-22 08:23:13
你應該添加一些關於你的問題的細節,你到底有什麼問題? – 2011-07-08 19:18:06