Django Admin: Как отобразить значение полей с list_display из двух моделей, которые находятся в отношении oneToOne?

Я верю, что ответ на мою проблему прост, но я нигде не могу его найти. Вот мое затруднительное положение. У меня есть две модели: Member и MemberDetail, которые находятся в отношении oneToOne, например:

class Member(models.Model):
   ID = models.AutoField(primary_key=True)
   FIRST_NAME = models.CharField('First name', max_length=50)
   LAST_NAME = models.CharField('Last name', max_length=50)
   def __unicode__(self):  
      return u'%s %s' % (self.FIRST_NAME, self.LAST_NAME)

class MemberDetail(models.Model):
   member = models.OneToOneField(Member, primary_key=True)
   DATE_OF_BIRTH = models.DateField('Date of birth')
   EMAIL = models.EmailField('E-mail')
   PHONE = models.CharField('Phone', max_length=15)

Теперь в моем admin.py я хочу показать таблицу для участника со всеми его данными, например:

class MemberDetailInline(admin.TabularInline):
    model = MemberDetail

class MemberAdmin(admin.ModelAdmin):
    list_display = ("FIRST_NAME", "LAST_NAME", "date_of_birth", "email", "phone")
    inlines = [
        MemberDetailInline,
    ]

admin.site.register(Member, MemberAdmin)

Я просто не знаю, как написать "date_of_birth", "email" и "phone" часть list_display. Самое близкое, что я мог сделать, это добавить это после строк:

def date_of_birth(self, MemberDetail):
    return MemberDetail.DATE_OF_BIRTH
def date_of_birth(self, MemberDetail):
    return MemberDetail.EMAIL
def date_of_birth(self, MemberDetail):
    return MemberDetail.PHONE

но поля показывались пустыми на странице. Каково решение? Благодарю.

3 ответа

Решение

В заключение!!! Я решил это. Как я думал, это было просто, но я должен был сделать это иначе и с наследованием нескольких таблиц:

models.py
class Member(models.Model):
    ID = models.AutoField(primary_key=True)
    FIRST_NAME = models.CharField('First name', max_length=50)
    LAST_NAME = models.CharField('Last name', max_length=50)

# Using multi table inheritance - automaticly creates one to one field
class MemberDetail(Member):
    DATE_OF_BIRTH = models.DateField('Date of birth')
    EMAIL = models.EmailField('E-mail')
    PHONE = models.CharField('Phone', max_length=15)

Теперь для admin.py

admin.py
class MemberDetailAdmin(admin.ModelAdmin):
    list_display = ("FIRST_NAME", "LAST_NAME", "DATE_OF_BIRTH", "EMAIL", "PHONE")

admin.site.register(MemberDetail, MemberDetailAdmin)

Вот и все. Может быть, есть и другие решения, но это хорошо для меня.

Если кто-то наткнется на этот вопрос / проблему, я не знаю прямого способа доступа к полям из отношения OneToOne, однако мне удалось исправить проблему с помощью следующего фрагмента. Обратите внимание, что я МОГУ получить доступ к полям OneToOne в list_filter используя два символа "_" для доступа к полям OneToOne, например: modelB_fieldOne.

      @admin.display(description='Date')
    def transaction_date(self, purchase):
        return purchase.transaction.date

list_display = ('product', 'transaction_date')
list_filter = ('product', 'transaction__date')

Вы должны просто быть в состоянии сделать 'member_detail__email'и т. д. в list_display

Поскольку это 1-1, у вас должна быть обратная ссылка, а на связанные поля ссылаются два символа подчеркивания.

Другие вопросы по тегам