Django:有效地从父对象读取子对象

时间:2019-09-13 06:33:35

标签: python django parent-child

我对django并不陌生,并且想知道在这里满足我的要求的最有效方法。我正在创建一个项目跟踪应用程序,其中一个项目可以有许多团队成员和clientteam成员以及多个反馈。我有一个单独的团队成员和客户团队表,但我也想跟踪项目中每个团队成员的角色。

我使用映射表尝试了以下模型结构,但现在我正努力从中获取数据到Django模板。

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse


class Project(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=300)

    primary_contact1 = models.CharField(max_length=100)
    primary_contact2 = models.CharField(max_length=100)

    start_date = models.DateField()
    end_date = models.DateField() 

    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    date_created = models.DateTimeField(default=timezone.now)
    date_last_modified = models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('project-detail', kwargs={'pk': self.pk})


class Teammember(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)

    def __str__(self):
        return self.first_name + " " + self.last_name

    def get_absolute_url(self):
        return reverse('teammember-detail', kwargs={'pk': self.pk})


class ProjectTeam(models.Model):
    project_team_member = models.ForeignKey(Teammember, related_name="project_team_member", on_delete=models.SET_NULL, null=True)
    project = models.ForeignKey(Project, related_name="project_team_project", on_delete=models.CASCADE)
    project_role = models.CharField(max_length=50)


    def __str__(self):
        return self.project.title + " - " + self.project_team_member.first_name + " - " + self.project_role


class Timesheet(models.Model):
    week_start_date = models.DateField()
    week_hours = models.IntegerField()

    project = models.ForeignKey(Project, related_name="ts_project", on_delete=models.CASCADE)
    project_team_member = models.ForeignKey(Teammember, related_name="ts_project_team_member", on_delete=models.CASCADE)

    def __str__(self):
        return self.project.title + " - " + self.project_team_member.first_name + " - " + self.week_start_date.strftime('%b/%d/%Y') + " - " + str(self.week_hours)

    def get_absolute_url(self):
        return reverse('timesheet-detail', kwargs={'pk': self.pk})

class Clientteam(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    location = models.CharField(max_length=50)
    designation = models.CharField(max_length=50)

    assigned_lead = models.ForeignKey(Teammember, related_name="assigned_lead", on_delete=models.SET_NULL, null=True)

    lead_generator = models.ForeignKey(User, related_name="lead_generator", on_delete=models.SET_NULL, null=True)
    date_created = models.DateTimeField(default=timezone.now)
    date_last_modified = models.DateTimeField(auto_now=True)


    def __str__(self):
        return self.first_name + " " + self.last_name

    def get_absolute_url(self):
        return reverse('clientteam-detail', kwargs={'pk': self.pk})


class ProjectClientTeam(models.Model):
    project_clientteam_member = models.ForeignKey(Clientteam, related_name="project_clientteam_member", on_delete=models.SET_NULL, null=True)
    project = models.ForeignKey(Project, related_name="project_client_team_project", on_delete=models.CASCADE)
    project_role = models.CharField(max_length=100)

    def __str__(self):
        return self.project.title + " - " + self.project_client_teammember.first_name + " - " + self.project_role


class Feedback(models.Model):
    overall_score = models.IntegerField()
    overall_desc = models.CharField(max_length=200)

    date_received = models.DateTimeField()

    project = models.ForeignKey(Project, related_name="feedback_project", on_delete=models.CASCADE)
    clientteam = models.ForeignKey(Clientteam, related_name="feedback_clientteam", on_delete=models.CASCADE)

    def __str__(self):
        return self.project.title + " - " + self.clientteam.first_name

    def get_absolute_url(self):
        return reverse('feedback-detail', kwargs={'pk': self.pk})

在模板中,我正在遍历项目并显示其所有字段,并希望遍历给定项目的所有团队成员和客户团队成员。我尝试了以下语法,但未显示任何数据:

{% for proj_m in projects.project_client_team_member_set.all %}
                                    <li><a class="article-text" href="{% url 'clientteam-detail' proj_m.id %}">{{ proj_m.first_name }} {{ proj_m.last_name }}</a> ( {{ proj_m.project_role }} )</li>
                                {% endfor %}

在我的情况下,模型结构可以更有效吗?如果不是,我在这里想直接从父级访问子级记录吗?

谢谢。

0 个答案:

没有答案