Я все еще новичок, и я застрял в сложном месте для меня. Я не могу "правильно" вставить данные из таблицы внешнего ключа в столбец 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>






Я думаю, что ваш код не работает, потому что 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
Давайте продолжим обсуждение в чате.