我正在尝试在“auth.Group”和任何其他自定义模型之间创建一个中间模型 Permissions;这将作为权限或对哪些组可见的方法。
我已经能够在“auth.Group”和一个模型之间创建一个中间模型 ExamplePermissions。
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))
然而,问题在于这反对可重用性。为了创建一个允许任何自定义模型与之关联的模型,我实现了一个 GenericForeignKey 来代替 ForeignKey,如下所示:
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)))
在尝试进行迁移时,它会出错:
core.Permissions: (fields.E336) 该模型被“simulations.Dumby.groups”用作中间模型,但它没有“Dumby”或“的外键”团体'。
乍一看,在中间表中使用 GenericForeignKey 似乎是一条死胡同。如果是这种情况,除了为每个定制模型创建定制中间模型的繁琐和冗余方法之外,是否还有一些普遍接受的方法来处理这种情况?