Django: GenericForeignKey — ограничить выбор типов

Django позволяет создавать очень гибкие связи между моделями посредством встроенного приложения contenttypes. Эта функциональность является надстройкой над иерархией приложение-модель и позволяет создавать связь модели с другими моделям разного типа.

Реализуется так:

class MyModel(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    ...

По сути такая схема создает ключ из двух полей — тип модели и ID объекта этого типа.

А вот так можно ограничить возможность выбора типа модели:

class MyModel(models.Model):
    limit = models.Q(app_label='app1', model='model1') | models.Q(app_label='app2', model='model2')
    content_type = models.ForeignKey(ContentType, limit_choices_to=limit)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    ...

Внимание! Аргументом model конструктора объекта Q должно быть имя модели, приведенное к нижнему регистру, т.е. ‘somemodel’ для модели SomeModel, соответственно.