2016-09-28 5 views
0

Я пытаюсь создать промежуточную модель, 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 в промежуточной таблице кажется тупиковым. Если это так, существует ли общепринятый способ обработки такой ситуации, кроме громоздкого и избыточного подхода к созданию пользовательской промежуточной модели для каждой пользовательской модели?

ответ

1

Не используйте ManyToManyField при использовании GenericForeignKey в вашей промежуточной модели; вместо этого, используйте GenericRelation, поэтому ваше поле группы будет просто объявлено:

groups = generic.GenericRelation(Permissions) 

См reverse generic relations для более подробной информации.

+0

Промежуточная модель не имеет ManyToManyField; обратите внимание, что Permissions является промежуточной моделью – QuintoViento

+0

Я хотел сказать: «Не используйте ManyToManyField в Дамби ...». Надеюсь, теперь вы получите мою точку зрения, которая заменит ManyToManyField на GenericRelation. – blhsing