2016-11-01 2 views
0

J'utilise mon autorisation personnalisée mixin sur plusieurs modèles de mes applications (pas tous). Pour le cas où je dois fusionner de l'autorisation "ancien contexte" à l'autorisation "nouveau contexte", je veux avoir une fonction qui change l'attribut de référence d'autorisation correspondant dans tous les modèles, qui sous-classe ce mélange. Comment puis-je savoir quels modèles ont sous-classé cette autorisation et comment ils ont l'attribut de référence d'autorisation hérité?Mise à jour d'instances sous-classées de Django mixin

En fait, je veux avoir une telle fonction dans mon mixin:

class WorkspaceManagedMixin(models.Model): 

    workspace = models.ForeignKey(Workspace) 

    class Meta: 
     abstract = True 

    @classmethod 
    def merge_to(cls, from_wspace, to_wspace): 
     """ 
     Reallocating workspace's objects to other workspace. 
     """ 

     workspace_managed_models = [] # HOW TO GET THIS? 

     try: 
      with transaction.atomic(): 
       for model in workspace_managed_models: 
        model.objects.filter(
         workspace=from_wspace, 
        ).update(workspace=to_wspace) 
     except IntegrityError as e: # or DatabaseError 
      raise e 

Les modèles peuvent être sous-classé dans d'autres applications django dans le projet.

Répondre

0

Uff. En fouillant Internet j'ai trouvé maintenant __subclasses__() et ceci dans le Django lui-même:

[subclass for subclass in m.__subclasses__() 
      if issubclass(subclass, models.Model)] 

Je suppose qu'il doit être a) récursive, b) converti en raison de mettre les doublons potentiels.