Django — проблема с диспетчером моделей — запрос

Я все еще новичок, и я застрял в сложном месте для меня. Я не могу "правильно" вставить данные из таблицы внешнего ключа в столбец ListView.

В основном я хочу создать список таблиц (FeatureFilm). Это также работает. Но в одном столбце я получаю информацию из другой таблицы, а здесь я получаю данные, но не те, которые относятся к конкретной строке таблицы.

Вот мои модели. Таблица, которую я хочу показать, — это модель FeatureFilm. Эта модель унаследована от моего базового класса Project "ProjectBaseModel". Затем идет еще одна таблица «Модель CompanyInvolved». Это прикреплено к таблице FeatureFilm с помощью внешнего ключа (feature_id).

Таким образом, фильмы хранятся (FeatureFilm), и в процессе создания фильмов участвуют разные компании. (Участвующая компания)

class ProjectBaseModel(models.Model):
    title = models.CharField("Titel", max_length=100, blank=False, unique=True)

    leading_postproduction_id = models.ForeignKey(
        Company,
        verbose_name = "Federführende Postproduktion",
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )
    phase = models.CharField(choices=post_phase, max_length=30, blank=True, null=True)
    former_title = models.CharField("Titel, ehemalig", max_length=100, blank=True)
    title_international = models.CharField(
        "Titel, international", max_length=100, blank=True, null=True, unique=True
    )

class FeatureFilm(ProjectBaseModel):
    class Meta:
        verbose_name = "Kinofilm"
        verbose_name_plural = "Kinofilme"
        ordering = ["title"]

class ProductionManager(models.Manager):
    def get_production(self):
        return (
            super()
            .get_queryset()
            .filter(company_role = "Produktion", is_production_list=True)
            .values_list("company_involved__name")
        )


class CompanyInvolved(models.Model):
    feature_id = models.ForeignKey(
        FeatureFilm,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
    )
    tv_movie_id = models.ForeignKey(
        TvMovie, on_delete=models.CASCADE, null=True, blank=True
    )
    company_role = models.CharField(
        choices=company_role,
        max_length=15,
        blank=True,
        help_text = "Produktion, Co-Produktion, Kinoverleiher, Sender, Weltvertrieb",
    )
    company_involved = models.ForeignKey(
        Company,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
    )


    is_production_list = models.BooleanField(
        default=False,
        verbose_name = "Produktion in Liste",
    )
    productionmanager = ProductionManager()

    def __str__(self):
        return "#" + str(self.pk)

    class Meta:
        verbose_name = "Produktion, Co-Produktion, Verleih, Sender, Weltvertrieb"
        verbose_name_plural = "Produktion, Co-Produktion, Verleih, Sender, Weltvertrieb"
        ordering = ["pk"]

Я в основном хотел сгенерировать вывод сейчас через шаблон. Я могу повторять строки с помощью шаблона для цикла. Но я также узнал, что более сложные запросы не работают в языке DjangoTemplate или просто не подходят для него. Мне не нужна каждая строка данных из CompanyInvolved, а только company_role="Production" и is_production_list=True. Комбинированное предложение «Где» в шаблоне теперь хорошо, но его не существует, поэтому я создал себе МЕНЕДЖЕР МОДЕЛЕЙ (ProductionManager), который выполняет эту фильтрацию в модели.

вот вид:

class FeatureListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
    permission_required = "project.can_access_featurefilm_list"
    model = FeatureFilm
    template_name = "project/feature-list.html"

    def handle_no_permission(self):
        return redirect("access-denied")

и вот зависимый фрагмент в шаблоне:

              <tbody>

                {% for project in object_list %}
                    <tr>

                        <td><a href = "{% url 'feature-detail-date' project.pk %}">{{ project.title }}</a></td>

                        <td>{{ project.companyinvolved_set.get_production }}
                        <br>
                        </td>
                        <td>{% if project.program_length_planned %}
                                {{ project.program_length_planned }}
                            {% endif %}
                        </td>
                        <td>{{ project.global_shooting_resolution }}</td>
                        <td>{{ project.global_resolution_theatrical }}</td>
                        <td>{% if project.hdr == 1%}
                                ja
                            {% else %}
                                nein
                            {% endif %}

                        </td>
                        <td>{{ project.stafflist.postproduction_supervisor_id.username }}</td>
                        <td>{% if project.phase %}
                            {{ project.phase }}
                            {% endif %}

                        </td>


                    </tr>

                  {% endfor %}
              </tbody>

поэтому я перебираю каждый проект фильма с {% для проекта в object_list %}, а затем я хочу показать в своей колонке «проблема» компанию, у которой есть производство роли, и, поскольку их может быть более одного, тот, который был ранее отмечен пользователем для просмотра списков -> is_production_list = TRue, после чего должен появиться вывод: {{ project.companyinvolved_set.get_production }}.

Результат идет в правильном направлении, но он еще не окончательно правильный. Я получаю данные CompanyINvolved, и они также фильтруются с помощью company_role = "Production" и is_production_list = True , но теперь эти значения отображаются для меня каждый раз в каждой отдельной строке одинаково, поэтому я получаю не для ROW связанные производства, а просто для каждого время ВСЕ. Мне не хватает ссылки на объект FeatureFilm, но я не знаю, как ее теперь получить или куда теперь поместить эту ссылку?

изменил мой шаблон:

 <tbody>

                {% for project in object_list %}
                    <tr>

                        <td><a href = "{% url 'feature-detail-date' project.pk %}">{{ project.title }}</a></td>

                        <td>
                          !! {{ project.production_companies.company_involved.name}}!!
                            <br>
                        </td>
                        <td>{% if project.program_length_planned %}
                                {{ project.program_length_planned }}
                            {% endif %}
                        </td>
                        <td>{{ project.global_shooting_resolution }}</td>
                        <td>{{ project.global_resolution_theatrical }}</td>
                        <td>{% if project.hdr == 1%}
                                ja
                            {% else %}
                                nein
                            {% endif %}

                        </td>
                        <td>{{ project.stafflist.postproduction_supervisor_id.username }}</td>
                        <td>{% if project.phase %}
                            {{ project.phase }}
                            {% endif %}

                        </td>


                    </tr>

                  {% endfor %}
          </tbody>
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что ваш код не работает, потому что get_production вызывает super().get_queryset(), который возвращает новый QuerySet без применения каких-либо фильтров, не на основе набора запросов в обратном поиске в companyinvolved_set

Лучше всего добавить аннотацию @property для доступа к отфильтрованному списку через модель FeatureFilm.

@property
def production_companies(self):
        return [company for company in self.companyinvolved_set.all() if company.company_role == 'Produktion' and company.is_production_list]

Затем добавьте это в свой шаблон:

<td>{% for production in project.production_companies %}{{production.company_involved.name}}{% endfor %}</td>

И чтобы предотвратить много запросов, измените метод get_queryset в вашем представлении на это:

def get_queryset(self):
    queryset = FeatureFilm.objects.prefetch_related('companyinvolved_set').all()
    return queryset

Давайте продолжим обсуждение в чате.

gomez_ 30.01.2023 15:46

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