10

我相信我的问题的答案很简单,但我在任何地方都找不到。这是我的困境。我有两个模型: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)

我根本不知道如何写 list_display 的“date_of_birth”、“email”和“phone”部分。我能做的最接近的事情是在内联之后添加:

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

但是页面上的字段显示为空。解决办法是什么?谢谢。

4

3 回答 3

18

最后!!!我解决了。因为我认为这很简单,但我不得不用其他方式和多表继承:

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)

就是这样。也许,还有其他解决方案,但这对我有好处。

于 2013-01-15T21:31:41.640 回答
0

如果有人偶然发现这个问题/问题,我不知道从 OneToOne 关系访问字段的直接方法,但是,我能够使用以下代码段解决问题。请注意,我可以list_filter通过使用两个“_”访问 OneToOne 的字段来访问 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')

于 2021-07-22T00:59:48.790 回答
-1

你应该能够做'member_detail__email'等。list_display

由于它是 1-1,因此您应该有一个 backref,并且使用两个下划线引用相关字段。

于 2013-01-14T23:42:02.417 回答