Как отобразить связанный объект, заданный в django?

Я знаю, что на этот вопрос, кажется, просто ответить, и что ответ будет где-то в ссылке на API, но я немного новичок в django и пролистал API в течение нескольких дней, пытаясь это сделать. Любая помощь будет высоко оценен!

Я создаю базовое приложение для блогов для компьютерных лабораторий моего университета, и в этом приложении у вас есть две соответствующие страницы. Страница местоположений, которая отображает информацию о каждой лаборатории в кампусе (часы, местоположение / здание) и страницу ресурсов, которая отображает информацию об оборудовании в каждой лаборатории.

Мой файл models.py настроен так, как показано на рисунке (есть другие модели, но это единственные соответствующие:

class Location(models.Model):
    name = models.CharField(max_length=100)
    computer = models.ForeignKey('Computer')
    printer = models.ForeignKey('Printer')

class Computer(models.Model):
    computer_location = models.ForeignKey('Location', related_name='lab_computers')
    computer_model = models.ForeignKey('HardwareModel')

class Printer(models.Model):
    printer_location = models.ForeignKey('Location', related_name='lab_printers')
    printer_model = models.ForeignKey('HardwareModel')

class HardwareModel(models.Model):
    brand = models.CharField(max_length = 100)
    model_num = models.CharField(max_length = 30)

Мой файл views.py:

class LocationsView(generic.ListView): #This isn't the view to be concerned with
    template_name = 'blog/location_list.html'
    context_object_name = 'locations'
    queryset = Location.objects.all()

#This is commented out because i was trying to modify the view to allow extra context
#I'm aware that you can't have 2 views with the same name. Just assume only one is active
#class ResourcesView(generic.ListView):
#    context_object_name = 'locations'
#    queryset = Location.objects.all()

def ResourcesView(request):
    locations = Location.objects.prefetch_related('lab_printers').all()
    return render_to_response('blog/resource_list.html',
          {'locations': locations})

Шаблон, в котором мне нужно отобразить это, выглядит так:

<table>
    <tr>
        <th>Lab</th>
        <th>Device</th>
        <th>Type</th>
        <th>Model</th>
    </tr>
    {% for location in locations %}
    <tr>
        <td rowspan="{{ location.lab_printers.count }}">{{ location.name }}</td>
        <td>Computer</td>
        <td>{{ location.computer.computer_model.brand }}</td>
        <td>{{ location.computer.computer_model.model_num }}</td>
    </tr>
    <tr>
        <td>Printer</td>
        <td>{{ location.printer.printer_model.brand }}</td>
        <td>{{ location.printer.printer_model.model_num }}</td>
    </tr>
{% endfor %}
</table>

Смысл отображения этого в том, что у университета есть строгие рекомендации по представлению информации на веб-страницах, и они хотят, чтобы все было в аккуратных упорядоченных таблицах. Таблица должна иметь динамический диапазон строк в первом столбце, чтобы люди могли добавлять или удалять типы компьютеров / принтеров через администратора django.

Я искал в Stackru и обнаружил несколько проблем, похожих на мою, и они сказали, что для получения связанных объектов в одном пакетном запросе используется prefetch_related, однако когда я сделал это, я начал получать TypeError "RelatedManager" не повторяется при попытке доступа принтеры в шаблоне. Я понимаю, почему это происходит. Это связано с тем, что класс RelatedManager, обрабатывающий запрос, не возвращает список / массив / кортеж. Я просто не знаю, как, черт возьми, я могу получить доступ к нужной мне информации так, как мне нужно.

Я частично работал с закомментированным общим видом, однако при использованииlocation.lab_printers.countЗначения возвращались непоследовательными и не отражали фактические объекты в базе данных, что приводило к неправильному форматированию и приводило к отсутствию элементов td и неточному отображению.

Извините, если я болтаю, это просто сложная проблема, и у меня совершенно нет идей, как мне поступить.

Любая помощь будет очень признательна. Спасибо за ваше время!

1 ответ

Решение

Не ответ, а использование ManyToManyField за Location-Computer а также Location-Printer связи. Документы ссылка1, ссылка2.

Другие вопросы по тегам