【问题标题】:Access and display value from a related model in Django在 Django 中访问和显示相关模型的值
【发布时间】:2015-01-01 18:05:58
【问题描述】:

我在 Django (1.7) 中定义了 2 个模型。它们如下(简化版):

from django.db import models
from django.utils import timezone
from datetime import timedelta

class ModelA(models.Model):
    email_addr = models.EmailField(max_length=100,verbose_name='Email')

class ModelB(models.Model):
    my_model = models.ForeignKey(ModelA)
    valid_until = models.DateTimeField('valid until', default=timezone.now()+timedelta(days=2))

可以看出,两个模型之间存在 OneToMany 关系。 1 ModelA 可以有一个或多个 ModelB。

在 admin.py 我有以下内容:

class ModelAAdmin(admin.ModelAdmin):
    list_display = ('id', 'email_addr')

admin.site.register(ModelA,ModelAAdmin)

我想在我的管理员中为 ModelA 的每条记录显示一个字段,该字段显示最新相关 ModelB 记录的字段 valid_until 的值。比如:

class ModelAAdmin(admin.ModelAdmin):
    most_recent_valid_until = // retrieve the related ModelB record with the most recent valid until value //
    list_display = ('id', 'email_addr', 'most_recent_valid_until')

例如,假设:

a) ModelA 有 1 条记录,其值为:id:1, email_addr:foo@bar.com

b) ModelB 的 2 条记录与 ModelA 的 id 为 1 的记录相关。它们如下:(id:5, valid_until:25/10/2014), (id:6, valid_until:27/10/2014)。

然后,我希望我的管理员显示如下记录列表:

1 foo@bar.com 27/10/2014

我对 Python 和 Django 很陌生,所以如果我的问题很明显,请见谅。

非常感谢!

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:
    class ModelAAdmin(admin.ModelAdmin):
        list_display = (..., 'get_valid_until')
    
        def get_valid_until(self, obj):
            return obj.modelb_set.last()
        get_valid_until.short_description = 'Valid until'
    

    【讨论】:

    • 它似乎完全按照我的意愿工作!非常感谢亚历克斯!
    【解决方案2】:

    list_display 将查找您的 ModelAdmin 的属性

    class ModelAAdmin(admin.ModelAdmin):
    
        list_display = ('id', 'email_addr', 'most_recent_valid_until')
    
        def most_recent_valid_until(self, obj):
          # do your query and return the data you want displayed in this row's `most_recent_valid_until` cell
    

    obj是ModelA实例,你可以查询它们相关的model b实例

    如果您在计算此属性时进行查询,它将在您的管理页面上进行大量查询...

    【讨论】:

      【解决方案3】:

      我认为您应该像这样将外键从 ModelB 移动到 ModelA:

      class ModelA(models.Model):
          my_model = models.ForeignKey(ModelB)
          email_addr = models.EmailField(max_length=100,verbose_name='Email')
      
      class ModelB(models.Model):
          valid_until = models.DateTimeField('valid until', default=timezone.now()+timedelta(days=2))
      

      然后将方法添加到 ModelA 类中:

      def valid_until():
          return self.my_model.valid_until
      

      并将list_display 更改为:

      list_display = ('id', 'email_addr', 'valid_until')
      

      希望对你有帮助:)

      【讨论】:

      • 也可以在移动外键后在 ModelAAdmin 中添加方法,例如:def valid_until(self, instance): return instance.my_model.valid_until
      【解决方案4】:

      您可以向 list_display() 添加自定义函数:

      class ModelAAdmin(admin.ModelAdmin):   
          list_display = ('id', 'email_addr', 'most_recent_valid_until')
      
      def most_recent_valid_until(self, obj):
          return obj.modelb_set.all().order_by('-valid_until').first()
      

      (未经测试)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多