2016-09-28 4 views
0

Ich versuche, ein intermediäres Modell, Berechtigungen, zwischen 'auth.Group' und anderen benutzerdefinierten Modellen zu erstellen; Dies dient als Berechtigungen oder als Mittel für das, was für welche Gruppen sichtbar ist.GenericForeignKeys in Intermediate-Modellen

Ich bin in der Lage, ein Zwischenmodell, ExamplePermissions, zwischen "Auth.Group" und einem Modell zu erstellen.

class Example(TimeStampable, Ownable, Model): 
     groups = models.ManyToManyField('auth.Group', through='ExamplePermissions', related_name='examples') 
     name = models.CharField(max_length=255) 
     ... 
     # Used for chaining/mixins 
     objects = ExampleQuerySet.as_manager() 

     def __str__(self): 
      return self.name 

    class ExamplePermissions(Model): 
     example = models.ForeignKey(Example, related_name='group_details') 
     group = models.ForeignKey('auth.Group', related_name='example_details') 
     write_access = models.BooleanField(default=False) 

     def __str__(self): 
      return ("{0}'s Example {1}").format(str(self.group), str(self.example)) 

Das Problem ist jedoch, dass dies der Wiederverwendbarkeit entgegensteht. Um ein Modell zu erstellen, das alle benutzerdefinierten Modell mit ihm in Verbindung gebracht werden können, implementiert ich eine GenericForeignKey anstelle eines ForeignKey wie folgt:

class Dumby(Model): 
     groups = models.ManyToManyField('auth.Group', through='core.Permissions', related_name='dumbies') 
     name = models.CharField(max_length=255) 

     def __str__(self): 
      return self.name 

    class Permissions(Model): 
     # Used to generically relate a model with the group model 
     content_type = models.ForeignKey(ContentType, related_name='group_details') 
     object_id = models.PositiveIntegerField() 
     content_object = GenericForeignKey('content_type', 'object_id') 
     # 
     group = models.ForeignKey('auth.Group', related_name='content_details') 
     write_access = models.BooleanField(default=False) 

     def __str__(self): 
      return ("{0}'s Content {1}".format(str(self.group), str(self.content_object))) 

Beim Versuch, Wanderungen zu machen, es Fehler mit:
core.Permissions: (fields.E336) Das Modell wird von 'simulations.Dumby.groups' als Zwischenmodell verwendet, hat aber keinen Fremdschlüssel für 'Dumby' oder 'Group'.

Auf den ersten Blick scheint die Verwendung eines GenericForeignKey in einer Zwischentabelle eine Sackgasse zu sein. Wenn dies der Fall ist, gibt es neben dem umständlichen und redundanten Ansatz der Erstellung eines benutzerdefinierten Zwischenmodells für jedes benutzerdefinierte Modell eine allgemein akzeptierte Möglichkeit, mit einer solchen Situation umzugehen?

Antwort

1

Verwenden Sie ManyToManyField nicht, wenn Sie GenericForeignKey in Ihrem Zwischenmodell verwenden. Verwenden Sie stattdessen GenericRelation, so dass Ihre Gruppen Feld einfach als deklariert werden würde:

groups = generic.GenericRelation(Permissions) 

reverse generic relations für mehr Details.

+0

Das Zwischenmodell hat kein ManyToManyField; Beachten Sie, dass Permissions ist das Zwischenmodell – QuintoViento

+0

Ich wollte sagen "nicht ManyToManyField in Dumby verwenden ...". Hoffentlich bekommst du jetzt meinen Punkt, der ManyToManyField durch GenericRelation ersetzen soll. – blhsing