2
class Parent(models.Model): 
    pass 

class RebelliousChild(Parent): 
    parent_fields = [__x.name for __x in Parent._meta._fields()] 

Django的1.3響應:Django的多表繼承上泄露的變量扼流圈模型定義

django.core.exceptions.FieldError: Local field '_RebelliousChild__x' 
in class 'RebelliousChild'clashes with field of similar name from base class 'Parent' 

Django的1.5響應:

FieldError: Local field u'id' in class 'RebelliousChild' clashes with field 
of similar name from base class 'Parent' 

我的第二反應(嘗試後使變量私人)是刪除變量(哪些工作。)

parent_fields = [__x.name for __x in Parent._meta._fields()] 
del __x 

列表理解leak their control variables in Python 2。 Django prohibits overriding parent field attributes,似乎涉及某種方式,因爲Django 1.5具有相同的問題。但是在這兩種情況下,泄漏屬性名稱_RebelliousChild__x未在父級上定義。

這是怎麼回事?

PS 使用 「列表(x.name在Parent._meta._fields X())」 比 「del x」 只是漂亮。請參閱上述https://stackoverflow.com/a/4199355關於不泄漏其控制變量的發電機。

回答