Django管理员更改列表以显示空外键(向后)

Django管理员更改列表以显示空外键(向后),django,django-models,django-admin,Django,Django Models,Django Admin,假设两种型号的标准外键为: Company(models.Model): name = models.CharField('Nome', max_length = 255) ... Ticket(models.Model): company = ForeignKey(Company) ... --更新 在这个例子中,我已经有很多公司在数据库中,但没有票证。考虑到这一点,我的概念可能是错误的。但我们还是要走了 在应用程序的admin.py中: class Tic

假设两种型号的标准外键为:

Company(models.Model):
    name = models.CharField('Nome', max_length = 255)
    ...

Ticket(models.Model):
    company = ForeignKey(Company)
    ...
--更新

在这个例子中,我已经有很多公司在数据库中,但没有票证。考虑到这一点,我的概念可能是错误的。但我们还是要走了

在应用程序的admin.py中:

class TicketAdmin(admin.ModelAdmin):
    # ...

    def queryset(self,request):
        # ...

        # This gives me the base I need: Companies without tickets
        companies = Company.objects.annotate(n = Count('ticket')).filter(n = 0)

        # But as the Ticket objects don't exist for a Company, I can't get them by a standard filter like:
        Ticket.objects.filter(company__in = [o.id for o in companies])
我怎样才能提出这样的问题

嗯。。。希望我现在已经够清楚了。

您尝试过:

Company.objects.filter(ticket_set=None)
根据您的评论更新:

要在管理中显示此信息

  • 为此模型创建一个
    ModelForm
  • 在此
    ModelForm
    中包括一个新的
    modelcooicefield
    ,您将相关的查询集和
    公司
    模型传递到该字段
  • 在该模型的
    ModelAdmin
    中,传递表单的参数-上面创建的
    ModelForm
  • 无论您想对所选公司执行什么操作,都可以跳过工单
    ModelForm
    上的
    save
    ,然后执行
我找到的解决方案:

在url.conf中,添加模式:

(r'^main/ligacao/$', 'main.admin_views.ticket_list_result')
然后,在admin_views.py中,创建ticket_list_result方法

from django.template import RequestContext
from django.shortcuts import render_to_response
from django.db.models import Count

def ticket_list_result (request):

    # ... parses, fetches, etc...

    # Get companies without tickets
    companies = Company.objects.annotate(n = Count('ticket')).filter(n = 0)

    results = list()    
    for c in companies:
        # Get tickets for the company
        tickets = Ticket.objects.filter(company = c.id)

        # Construct a dict to return to the view 
        results.append({
            'company': c,
            # ... any other desired info
        })

    return render_to_response(
        "admin/view_template.html",
        {'results' : results },
        RequestContext(request, {}),
    )
并在“admin/view_template.html”的视图中列出这些结果:

{%block result\u list%}
单位
{results%%中r的%s}
{{r.company}}
{%endfor%}
{%endblock%}

不错。谢谢我在shell中得到了期望的结果,但我只是不知道如何将其放入管理更改列表中。再次感谢。我不确定你是否完全理解,所以我更新了问题,试图让事情更清楚。我开始在管理视图中进行这方面的工作。可能比寻找调整adminModels和save()钩子的方法更容易。
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.db.models import Count

def ticket_list_result (request):

    # ... parses, fetches, etc...

    # Get companies without tickets
    companies = Company.objects.annotate(n = Count('ticket')).filter(n = 0)

    results = list()    
    for c in companies:
        # Get tickets for the company
        tickets = Ticket.objects.filter(company = c.id)

        # Construct a dict to return to the view 
        results.append({
            'company': c,
            # ... any other desired info
        })

    return render_to_response(
        "admin/view_template.html",
        {'results' : results },
        RequestContext(request, {}),
    )
{% block result_list %}

    <table cellspacing="0" id="result_list">

        <thead>
            <tr>
                <th>Company</th>
                <!-- other columns -->
            </tr>
        </thead>

        <tbody>
            {% for r in results %}
                <tr class="{% cycle 'row1' 'row2' %}">
                    <th>{{ r.company }}</th>
                    <!-- other company info -->
                </tr>
            {% endfor %}
        </tbody>

    </table>

{% endblock %}