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
(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 %}