fromdjango.dispatchimportreceiverfromdjango.db.modelsimportsignals,ForeignKeyfromdjango.db.models.fields.relatedimportForeignRelatedObjectsDescriptordefoverride_model_field(model,name,field):original_field=model._meta.get_field(name)ifnotisinstance(field,original_field.__class__):raiseTypeError('Model {!r} field {!r} is not compatible with {!r}'.format(model,name,field.__class__.__name__))iffield.rel:# Ensure we are referencing another proxy class.ifnotfield.rel.to._meta.proxy:raiseTypeError('You must relate to another proxy class, not {!r}'.format(field.rel.to.__name__))related_name=getattr(field,'related_name',original_field.related.get_accessor_name())related_model=getattr(field.rel.to,related_name).related.modelifrelated_model._meta.proxy:raiseTypeError('There is already a proxy model {!r} related to {!r} using {!r}'.format(related_model.__name__,field.rel.to.__name__,related_name))model.add_to_class(name,field)iffield.rel:field.rel.to.add_to_class(related_name,ForeignRelatedObjectsDescriptor(field.related))classProxyField(object):def__init__(self,field):self.field=fielddefcontribute_to_class(self,model,name):@receiver(signals.class_prepared,sender=model,weak=False)deflate_bind(sender,*args,**kwargs):override_model_field(model,name,self.field)classProxyForeignKey(ProxyField):def__init__(self,*args,**kwargs):super(ProxyForeignKey,self).__init__(ForeignKey(*args,**kwargs))
Comments (0)
HTTPSSSH
You can clone a snippet to your computer for local editing.
Learn more.