Я пытаюсь создать промежуточную модель, Permissions, между 'auth.Group' и любыми другими настраиваемыми моделями; это будет служить разрешениями или средствами того, что видно для групп.GenericForeignKeys в промежуточных моделях
Я смог создать промежуточную модель, ExamplePermissions, между 'auth.Group' и одной моделью.
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» или «Group».
На первый взгляд использование GenericForeignKey в промежуточной таблице кажется тупиковым. Если это так, существует ли общепринятый способ обработки такой ситуации, кроме громоздкого и избыточного подхода к созданию пользовательской промежуточной модели для каждой пользовательской модели?
Промежуточная модель не имеет ManyToManyField; обратите внимание, что Permissions является промежуточной моделью – QuintoViento
Я хотел сказать: «Не используйте ManyToManyField в Дамби ...». Надеюсь, теперь вы получите мою точку зрения, которая заменит ManyToManyField на GenericRelation. – blhsing