【问题标题】:list_display of the model with foreign keylist_display 带有外键的模型
【发布时间】:2013-12-06 15:13:23
【问题描述】:

我有以下 django 模型。 在TestCase 表的django admin 模型中,在它的list_display 中,我想显示最近的评论和Remark 表的修饰符名称。

models.py

from django.db import models

class Release(models.Model):
    title        = models.CharField(max_length=128)
    start_time   = models.DateField('Release Start Date')
    release_date = models.DateField('Release Ended Date')

    def __str__(self):
        return self.title

class TestCase(models.Model):
    query       = models.CharField(max_length=256)
    ksq_id      = models.IntegerField()
    status      = models.CharField(max_length=64)
    release     = models.ForeignKey(Release) # Release can have many test cases

    def __str__(self):
        return self.query

class Remark(models.Model):
    owner       = models.CharField(max_length=64)
    module      = models.CharField(max_length=64)
    comment     = models.CharField(max_length=1024)
    modified_ts = models.DateTimeField('date modified', auto_now=True)
    modifier    = models.CharField(max_length=64)
    testcase    = models.ForeignKey(TestCase) # Testcase can have many Re

admin.py

from django.contrib import admin
from kramer_release.models import Release, TestCase, Remark

class RemarksInline(admin.TabularInline):
    model = Remark
    extra = 0 

class RemarkAdmin(admin.ModelAdmin):
    list_display = ('owner', 'module', 'testcase_query')

    def testcase_query(self, obj):
        return obj.testcase.query

class TestCaseAdmin(admin.ModelAdmin):
    inlines = [RemarksInline]
    list_display = ('query', 'status')

admin.site.register(Release)
admin.site.register(TestCase, TestCaseAdmin)
admin.site.register(Remark, RemarkAdmin)

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您可以在管理类中定义一个函数来获取最新评论,例如:

    class TestCaseAdmin(admin.ModelAdmin):
        inlines = [RemarksInline]
        list_display = ('query', 'status', 'latest_comment')
    
        def latest_comment(self, obj):
            remarks = Remark.objects.filter(testcase=obj).order_by('-modified_ts')
            if remarks:
                return '%s - %s' % (remarks[0].comment, remarks[0].modifier)
            return None
    

    see the docs

    【讨论】:

    • 感谢您的回答。我需要注释和修饰符是两个不同的字段。我可以将您的代码扩展到两个函数。这个操作不是很昂贵,因为它会在每行渲染上执行两个查询吗?还有其他简单优雅的方式吗?
    • 啊好吧,是的,绝对是昂贵的,尤其是。当你有很多行显示时。
    • 这个查询可以更简洁地表示为obj.remark_set.latest('modified_ts') - 尽管这对多个查询没有帮助。我不确定有多少可以做的。执行多个列而不在两个不同的函数中重复查询很复杂,您可能必须覆盖管理模板。
    • 我的模型架构中是否存在一些问题,这使得这变得复杂?我的用例看起来很常见。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2011-04-21
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多