Django: Как фильтровать модель с помощью условия "where" для отображения в списке связанных с администратором объектов
У меня есть 2 модели, которые зависят друг от друга. Одна из них - модель FeatureFilm
, а другая - модель CompanyInvolved
.
В таблице FeatureFilm
я хочу хранить фильмы, а в таблице CompanyInvolved
я хочу хранить множество компаний, которые участвовали в создании фильма. Модель CompanyInvolved
привязана к таблице FeatureFilm
с помощью внешнего ключа. Я хочу отобразить столбец из таблицы CompanyInvolved
в представлении списка в панели администратора FeatureFilm
. Я уже сделал это с помощью своего кода. Единственное, что у меня пока не получилось, это фильтр, который фильтрует таблицу CompanyInvolved
по полю company_role
. Я хочу показать только те значения, которые имеют company_role = "Produktion"
. Ах да, я хочу показать только первую производственную компанию, остальные строки не играют роли в представлении таблицы списка. много приветствий Может кто-нибудь помочь? много приветствий
вот мой код зависимости:
model.py
company_role = [
("Produktion", "Produktion"),
("Co-Produktion", "Co-Produktion"),
("Kinoverleih", "Kinoverleih"),
("Sender", "Sender"),
("Weltvertrieb", "Weltvertrieb"),
]
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,
)
class FeatureFilm(ProjectBaseModel):
class Meta:
verbose_name = "Kinofilm"
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,
)
def __str__(self):
return "#" + str(self.pk)
views.py
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")
admin.py --- вот код, который является моей проблемой****look to get_company_involved
@admin.register(FeatureFilm)
class FeatureFilmAdmin(admin.ModelAdmin):
inlines = [
SalesInfoSetInLine,
ContentInfoSetInLine,
CompanyInvolvedSetInLine,
]
list_display = [
"title",
"get_company_involved",
"program_length_planned",
]
def get_company_involved(self, obj):
productioncompany = (
FeatureFilm.objects.filter(pk=obj.id)
.values("companyinvolved__company_involved__name")
.first()
)
return productioncompany["companyinvolved__company_involved__name"]
get_company_involved.short_description = "Produktion"
я пробовал больше раз и решил свой вопрос. вот решение, в get_production_involved вы можете увидеть правильный запрос
@admin.register(FeatureFilm)
class FeatureFilmAdmin(admin.ModelAdmin):
inlines = [
SalesInfoSetInLine,
CompanyInvolvedSetInLine,
]
list_display = [
"title",
"get_production_involved",
]
def get_production_involved(self, obj):
production_company = (
FeatureFilm.objects.filter(
pk=obj.id,
companyinvolved__company_role="Produktion",
companyinvolved__is_production_list=True,
)
.values_list("companyinvolved__company_involved__name")
.first()
)
if production_company:
return production_company
else:
production_company = (
FeatureFilm.objects.filter(
pk=obj.id,
companyinvolved__company_role="Produktion",
)
.values_list("companyinvolved__company_involved__name")
.first()
)
return production_company
get_production_involved.short_description = "Produktion"