Список изменений администратора Django для отображения нулевых ForeignKeys (в обратном направлении) - PullRequest
2 голосов
/ 20 февраля 2011

Предположим стандартный ForeignKey для двух моделей, например:

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

Ticket(models.Model):
    company = ForeignKey(Company)
    ...

- Обновление

В этом примере у меня уже много компаний в базе данных, но Ticket нет.Учитывая это, я могу ошибаться в концепции.Но все равно мы идем ...

В 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])

Как мне сделать такой запрос?

Ну ...надеюсь, теперь я достаточно ясно.

Ответы [ 3 ]

1 голос
/ 20 февраля 2011
Company.objects.annotate(tickets=Count('ticket')).filter(tickets=0)

Обновление на основе вашего комментария:

Чтобы отобразить это в админке,

  • Создать ModelForm, для этой модели
  • В это ModelForm включается новый ModelChoiceField, которому вы передаете соответствующий набор запросов и модель Company.
  • В ModelAdmin для этой модели передайте аргумент для формы - ModelForm, созданный выше.
  • Что бы вы ни хотели сделать с выбранной Компанией, переберите save в Билете ModelForm и сделайте.
1 голос
/ 22 февраля 2011

Решение, которое я нашел:

В urls.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_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 %}
1 голос
/ 20 февраля 2011

Вы пробовали:

Company.objects.filter(ticket_set=None)
...