В соответствии с предложением Роузмана, приведенным выше, вы можете отображать связанные данные (один-к-одному или многие-к-одному) только для чтения с помощью встроенных моделей администрирования. Вот небольшой пример, просто чтобы убедиться, что мы все на одной странице. Ниже вы можете увидеть, что есть три способа достижения вашей цели (если я правильно понимаю эту цель).
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. Например, при получении сотрудника, у которого есть автомобиль с определенным номером рего:
Employee.objects.filter(car__rego='111')
Надеюсь, это поможет.
J