Django: Отображение inline через прямую связь

У меня есть модели:

class CustomUser(AbstractUser):
    employee_number = models.CharField(max_length=255, blank=True, db_index=True)
    position = models.ForeignKey(
        'orgunits.Position',
        on_delete=models.CASCADE,
        related_name='employees'
    )


class Position(models.Model):
    orgunit = models.ForeignKey(
        OrgUnit,
        on_delete=models.CASCADE,
        verbose_name=_('orgunit'),
        related_name='positions',
    )
    name = models.CharField(_('name'), max_length=255)


class OrgUnit(models.Model):
    name = models.CharField(_('name'), max_length=255)
    type = models.CharField(_('type'), max_length=55)
    address = models.TextField(_('address'), null=True, blank=True)

Я хотел бы отобразить все экземпляры CustomUser, назначенные OrgUnit:

class OrgUnitEmployeesInline(admin.TabularInline):
    model = CustomUser


class OrgUnitAdmin(admin.ModelAdmin):
    model = OrgUnit
    inlines = OrgUnitEmployeesInline,

Но, конечно же, есть ошибка:

<class 'orgunits.admin.OrgUnitEmployeesInline'>: (admin.E202) 'authentication.CustomUser' не имеет ForeignKey для 'orgunits.OrgUnit'.

.

потому что Position имеет ForeignKey к 'orgunits.OrgUnit'.

Также я попробовал следующее:

class OrgUnitEmployeesInline(admin.TabularInline):
    model = CustomUser
    fk_name = 'position'

но ошибка:

<class 'orgunits.admin.OrgUnitEmployeesInline'>: (admin.E202) fk_name 'position' не является ForeignKey к 'orgunits.OrgUnit'.

Как я могу отображать пользователей в организациях в режиме inline?

Вам необходимо добавить ForeignKey к class OrgUnit(models.Model), если вы хотите получить доступ к OrgUnit объектам, связанным с CustomUser.

class OrgUnit(models.Model):
    ...
    user = ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='orgunits')

тогда вы можете получить доступ к OrgUnit объектам, связанным с CustomUser следующим образом:

user = CustomUser.objects.get(id=1)
user.orgunits.all()    # QuerySet of all related `OrgUnit` objects
user.orgunits.filter(name__startswith="An")    # you can filter in standard way

Вам необходимо установить соответствующие отношения, если вы хотите использовать Inline перекрестные классы.

Для получения подробной информации предлагаю официальные DOCS.

Вернуться на верх