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.