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?
Das Zwischenmodell hat kein ManyToManyField; Beachten Sie, dass Permissions ist das Zwischenmodell – QuintoViento
Ich wollte sagen "nicht ManyToManyField in Dumby verwenden ...". Hoffentlich bekommst du jetzt meinen Punkt, der ManyToManyField durch GenericRelation ersetzen soll. – blhsing