Django - Probleme mit einer query

Django, Flask, Bottle, WSGI, CGI…
Antworten
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

Hi, ich bin noch Anfänger und stecke an einer für mich herausfordernden Stelle fest.
Ich bekomme Daten einer Fremdschlüssel Tabelle nicht "richtig" in einer Spalte einer ListView eingefügt.

Ich möchte grunsätzlich eine Listendarstellung einer Tabelle (FeatureFilm) erzeugen. Das klappt auch. In einer Spalte hole ich aber Informationen aus einer anderen Tabelle und hier bekomme ich zwar Daten, aber nicht die, die zu der jeweiligen Tabellenzeile gehören.

Hier sind meine models. Die Tabelle die ich zeigen möchte ist "FeatureFilm" Model. Dieses Model ist vererbt von meiner Basis Project Klasse "ProjectBaseModel".
Dann gibt es noch eine weitere Tabelle das "CompanyInvolved Model. Das hängt wiederum mit einem Fremdschlüssel (feature_id) an der FeatureFilm Tabelle dran.

es werden also Filme gespeichert (FeatureFilm) und an den Filmen sind verschiedene Firmen im Entstehungsprozess beteiligt. (CompanyInvolved)

Code: Alles auswählen

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"]
    
    
Ich wollte grundsätzlich nun über das Template die Ausgabe erzeugen. Die Zeilen kann ich mit der Template For-Schleife iterieren. Habe aber auch gelernt, das komplexere Abfragen in der DjangoTemplate Sprache nicht funktionieren, bzw. dort einfach nicht hin gehören.
Ich benötige aus der CompanyInvolved nicht jede Datenzeile, sondern nur die company_role = "Produktion" und is_production_list = True
Eine kombinierte "Where" Klausel im Template jetzt schön, gibt es aber nicht, also habe ich mir einen MODEL MANAGER (ProductionManager) gebaut, der dieses Filtering im Model macht.

hier ist die View:

Code: Alles auswählen

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")

und hier der Ausschnitt aus dem Template:

Code: Alles auswählen

<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>

ich iterere also über jedes Filmprojekt mit {% for project in object_list %} und möchte dann in meiner "Problem" Spalte die Firma anzeigen, die die Rolle Produktion hat und da es mehrere geben kann, die die vom User zuvor für die Listen Ansicht markiert wurde - > is_production_list = TRue und dann solle die Ausgabe kommen: {{ project.companyinvolved_set.get_production }}.

Das Ergebnis geht zwar in die richtige Richtung, ist aber noch nicht endgültig richtig. Ich bekomme zwar die CompanyINvolved Daten und diese sind auch gefiltert nach company_role = "Produktion" und is_production_list = True , aber diese Werte werde mir nun jedesmal in jede einzelne Row gleich angezeigt, ich bekomme also nicht pro ROW die dazugehörigen Produktionen sondern einfach jedesmal ALLE. Mir fehlt der Bezug zum FeatureFilm Objekt, Wüsste aber nicht, wie ich diesen jetzt herbekommen, bzw wo ich diesen Bezug jetzt einbaue ??

viele Grüße
gomez
Antworten