Как добавить вычисляемое поле в админку django inline

Я пытаюсь добавить вычисляемое поле в Django Admin Inline. Рассмотрим этот набор классов:

models.py:

class MyGroup(models.Model):
  group_name = models.CharField()
  group_size = models.IntegerField()

class MyUser(models.Model):
  user_name = models.CharField()
  groups = models.ManyToMany(MyGroup, related_name="users", through=MyMembership)
    
class MyMembership(models.Model):
  group = models.ForeignKey(MyGroup)
  user = models.ForeignKey(MyUser)
  timestamp = models.DateTimeField(auto_add_now=True)

Я хочу показать поле group.size в инлайне. Я думал, что следующий код будет работать (основываясь на этом ответе):

admin.py:


class MyMembershipInline(admin.TabularInline):
  model = MyUser.groups.through
  fields = (
    "group",
    "timestamp",
    "size",
  )
  readonly_fields = (
    "timestamp",
    "size",
  )

  def size(self, instance):
    return instance.group.size

@admin.register(MyUser):
class MyUserAdmin(admin.ModelAdmin)
  fields = ("user_name",)
  inlines = (MyMembershipInline,)

Но я получаю следующую ошибку:

Неизвестное поле (поля) (размер), указанное для MyMembership

Есть совет?

В итоге мне пришлось использовать пользовательскую ModelForm в inline. Я сделал это следующим образом:

admin.py:

class MyMembershipInlineForm(forms.ModelForm):
  class Meta:
    model = MyUser.groups.through
    fields = ("group", )
    readonly_fields = (
      "timestamp",
      "size",
    )
  size = forms.IntegerField(disabled=True)

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    my_membership = self.instance
    self.initial = {
      "size": my_membership.group.size if my_membership.pk else None
    }

class MyMembershipInline(admin.TabularInline):
  model = MyUser.groups.through
  fields = (
    "group",
    "timestamp",
    "size",
  )
  form = MyMembershipInlineForm

@admin.register(MyUser):
class MyUserAdmin(admin.ModelAdmin)
  fields = ("user_name",)
  inlines = (MyMembershipInline,)
Вернуться на верх