2013-12-06 3 views
0

У меня есть следующая модель django. В django-админ-модели таблицы TestCase в списке list_display я хочу отобразить последний комментарий и имя модификатора таблицы Remark.list_display модели с внешним ключом

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) 

ответ

0

Вы можете определить функцию, чтобы получить последнюю комментарий как часть вы админ класса, что-то вроде:

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

+0

Спасибо за ваш ответ. Мне нужен комментарий и модификатор для двух разных полей. Я могу расширить свой код до двух функций. Разве эта операция не стоит дорого, так как она будет выполнять два запроса при каждой рендеринг строк? Есть ли другой простой или элегантный способ? –

+0

ах ок, да определенно дорого, особенно. когда у вас много строк. – JamesO

+0

Этот запрос можно более кратко выразить как 'obj.remark_set.latest ('modified_ts')' - хотя это не поможет с несколькими запросами. Я не уверен, что многое можно сделать по этому поводу. Выполнение нескольких столбцов без повторения запроса в двух разных функциях сложно, вам, вероятно, придется переопределить шаблон администратора. –

Смежные вопросы