Список связанных полей в Django ModelAdmin

Я перечисляю модель в администраторе Django через TabularInline. Внутри этого встроенного я хотел бы использовать синтаксис обхода модели Django для отображения данных в других моделях, упомянутых в модели, с помощью внешних ключей. например

class MyRelatedModel(models.Model) name = models.CharField(max_length=50) created = models.DateField(auto_now_add=True) other = models.ForeignKey('MyOtherRelatedModel') class MyOtherRelatedModel(models.Model) name = models.CharField(max_length=50) created = models.DateField(auto_now_add=True) class MyRelatedModelInline(admin.TabularInline): model = MyRelatedModel fields = ['name', 'created', 'other__name'] #readonly_fields = ['name', 'created', 'other__name'] 

Однако использование «other__name» вызывает ошибку ImproperlyConfigured:

 'MyRelatedModelInline.fields' refers to field 'other__name' that is missing from the form 

Синтаксис обхода модели не поддерживается в экземплярах ModelAdmin? Если это поддерживается, что я делаю неправильно?

EDIT: Если я раскомментировал readonly_fields, ошибка будет:

 Caught AttributeError while rendering: 'MyMainModelAdmin' object has no attribute '__name__' 

Согласно предложению Розентана выше, вы можете отображать связанные (один-к-одному или много-к-одному) данные в режиме чтения с помощью моделей администрирования Inline. Вот небольшой пример, просто чтобы убедиться, что мы все на одной странице. Ниже вы можете видеть, что есть три способа достижения вашей цели (если я правильно понимаю эту цель).

models.py:

 class Company(models.Model): name = models.CharField(max_length=50) class Employee(models.Model): name = models.CharField(max_length=50) company = models.ForeignKey('Company') car = models.ForeignKey('Car') def model_callable(self): return self.car.rego class Car(models.Model): rego = models.CharField(max_length=50) 

admin.py:

 def unbound_callable(emp): return emp.car.rego class EmployeeInline(admin.TabularInline): model = Employee fields = ('name', 'model_callable', 'model_admin_callable', unbound_callable) readonly_fields = ('model_callable', 'model_admin_callable', unbound_callable) def model_admin_callable(self, emp): return emp.car.rego class CompanyAdmin(admin.ModelAdmin): model = Company inlines = (EmployeeInline,) admin.site.register(Company, CompanyAdmin) 

Как вы можете видеть, «readonly_fields» обрабатывается так же, как «list_display» в соответствии с документацией Django для contrib.admin (начиная с версии 1.2).

В приведенном выше примере, когда вы редактируете компанию, вы увидите ее сотрудников. Каждая строка будет иметь имя сотрудника в редактируемом текстовом поле, а рядом с именем вы увидите только текстовый бит текста для рего для автомобиля сотрудника (emp.car.rego).

Ссылаясь на ваш первоначальный вопрос, вы хотели бы ссылаться на связанные данные как «other__name». Это не сработает. Выражения, такие как other__name или car__rego имеют особое значение как аргументы ключевого слова в фильтрах при запуске Django-запросов. Например, при получении сотрудника, у которого есть автомобиль с определенным номером rego:

 Employee.objects.filter(car__rego='111') 

Надеюсь, это поможет.

J