Django Detailview对象关系

Django Detailview对象关系,django,django-models,django-views,Django,Django Models,Django Views,;TLDR-在发现一些解决方案后,我的最后一个问题是,如果有,我如何访问与主detailview模型相关的模型 我试图使用一个通用的detailview来返回一个对象及其相关对象。在本例中,像麦当劳这样的公司将拥有任何站点(或位置)。我希望detailview能够显示公司详细信息,以及与公司相关的站点详细信息。但是我被卡住了。尽管我努力不寻求帮助,但我无法从引用公司网站的模型中提取数据。我哪里做错了?我已经在django shell中用SiteModel.objects.filter(compa

;TLDR-在发现一些解决方案后,我的最后一个问题是,如果有,我如何访问与主detailview模型相关的模型

我试图使用一个通用的detailview来返回一个对象及其相关对象。在本例中,像麦当劳这样的公司将拥有任何站点(或位置)。我希望detailview能够显示公司详细信息,以及与公司相关的站点详细信息。但是我被卡住了。尽管我努力不寻求帮助,但我无法从引用公司网站的模型中提取数据。我哪里做错了?我已经在django shell中用
SiteModel.objects.filter(company=5)
证明了这一点

型号.py

'''
The company model consists of the base company information 
'''

class CompanyModel(models.Model):
    name = models.CharField(_('Company Name'), max_length=255, blank=False)
    website = models.URLField(_('Company Website'), blank=True)
    since = models.DateField(auto_now_add=True)
    rate = models.DecimalField(max_digits=5, decimal_places=2, blank=False)

    def __str__(self):
        return '%s' % (self.name)

    class Meta:
        ordering = ['name']
        verbose_name = 'Company'
        verbose_name_plural = 'Companies'

'''
The site model consists of sites of a company as
some companies have several sites that we will work from.
'''


class SiteModel(models.Model):
    company = models.ForeignKey(CompanyModel, on_delete=models.PROTECT)
    address = models.ForeignKey(AddressModel, on_delete=models.PROTECT)
    phone = models.ForeignKey(PhoneModel, blank=True, null=True, on_delete=models.PROTECT)
    distance = models.SmallIntegerField(blank=True)

    def __str__(self):
        return '%s - %s, %s' % (self.company, self.address.city, self.address.state)

    class Meta:
        ordering = ['company']
        verbose_name = 'Company Site Information'
        verbose_name_plural = 'Company Sites'
class CompanyDetailView(DetailView):
    model = CompanyModel
    template_name = 'customers/detail.html'

    def get_context_data(self, **kwargs):
            context = super(CompanyDetailView, self).get_context_data(**kwargs)
            context['sites'] = SiteModel.objects.filter(id=self.kwargs['pk'])
            return context
   url(r'^customer/(?P<pk>[0-9a-z-]+)/detail/$', CompanyDetailView.as_view(),
       name='customer-detail'),
class ServiceReportModel(models.Model):
    report_number = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    site = models.ForeignKey(customers_models.SiteModel, on_delete=models.PROTECT, related_name='reports')
    request_number = models.ForeignKey(ServiceRequestModel,
                                       on_delete=models.PROTECT,
                                       null=True,
                                       blank=True,
                                       related_name='s_report_number'
                                       )
    reported_by = models.ForeignKey(main_models.MyUser, related_name='reports')
    reported_date = models.DateTimeField(auto_now_add=True)
    updated_by = models.ForeignKey(main_models.MyUser, blank=True, null=True, related_name='+')
    updated_date = models.DateTimeField(auto_now=True)
    equipment = models.ForeignKey(customers_models.EquipmentModel, on_delete=models.PROTECT)
    report_reason = models.CharField(max_length=255, null=True)
    time_in = models.DateTimeField(blank=True, null=True)
    time_out = models.DateTimeField(blank=True, null=True)
    actions_taken = models.TextField(null=False, blank=False)
    recommendations = models.TextField(null=True, blank=True)

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

    def __str__(self):
        return '%s - %s, %s' % (self.site.company, self.reported_date.strftime('%d %B %Y'), self.equipment.name)

    class Meta:
        ordering = ['reported_date']
        verbose_name = 'Service Report'
        verbose_name_plural = 'Service Reports'
视图.py

'''
The company model consists of the base company information 
'''

class CompanyModel(models.Model):
    name = models.CharField(_('Company Name'), max_length=255, blank=False)
    website = models.URLField(_('Company Website'), blank=True)
    since = models.DateField(auto_now_add=True)
    rate = models.DecimalField(max_digits=5, decimal_places=2, blank=False)

    def __str__(self):
        return '%s' % (self.name)

    class Meta:
        ordering = ['name']
        verbose_name = 'Company'
        verbose_name_plural = 'Companies'

'''
The site model consists of sites of a company as
some companies have several sites that we will work from.
'''


class SiteModel(models.Model):
    company = models.ForeignKey(CompanyModel, on_delete=models.PROTECT)
    address = models.ForeignKey(AddressModel, on_delete=models.PROTECT)
    phone = models.ForeignKey(PhoneModel, blank=True, null=True, on_delete=models.PROTECT)
    distance = models.SmallIntegerField(blank=True)

    def __str__(self):
        return '%s - %s, %s' % (self.company, self.address.city, self.address.state)

    class Meta:
        ordering = ['company']
        verbose_name = 'Company Site Information'
        verbose_name_plural = 'Company Sites'
class CompanyDetailView(DetailView):
    model = CompanyModel
    template_name = 'customers/detail.html'

    def get_context_data(self, **kwargs):
            context = super(CompanyDetailView, self).get_context_data(**kwargs)
            context['sites'] = SiteModel.objects.filter(id=self.kwargs['pk'])
            return context
   url(r'^customer/(?P<pk>[0-9a-z-]+)/detail/$', CompanyDetailView.as_view(),
       name='customer-detail'),
class ServiceReportModel(models.Model):
    report_number = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    site = models.ForeignKey(customers_models.SiteModel, on_delete=models.PROTECT, related_name='reports')
    request_number = models.ForeignKey(ServiceRequestModel,
                                       on_delete=models.PROTECT,
                                       null=True,
                                       blank=True,
                                       related_name='s_report_number'
                                       )
    reported_by = models.ForeignKey(main_models.MyUser, related_name='reports')
    reported_date = models.DateTimeField(auto_now_add=True)
    updated_by = models.ForeignKey(main_models.MyUser, blank=True, null=True, related_name='+')
    updated_date = models.DateTimeField(auto_now=True)
    equipment = models.ForeignKey(customers_models.EquipmentModel, on_delete=models.PROTECT)
    report_reason = models.CharField(max_length=255, null=True)
    time_in = models.DateTimeField(blank=True, null=True)
    time_out = models.DateTimeField(blank=True, null=True)
    actions_taken = models.TextField(null=False, blank=False)
    recommendations = models.TextField(null=True, blank=True)

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

    def __str__(self):
        return '%s - %s, %s' % (self.site.company, self.reported_date.strftime('%d %B %Y'), self.equipment.name)

    class Meta:
        ordering = ['reported_date']
        verbose_name = 'Service Report'
        verbose_name_plural = 'Service Reports'
url.py

'''
The company model consists of the base company information 
'''

class CompanyModel(models.Model):
    name = models.CharField(_('Company Name'), max_length=255, blank=False)
    website = models.URLField(_('Company Website'), blank=True)
    since = models.DateField(auto_now_add=True)
    rate = models.DecimalField(max_digits=5, decimal_places=2, blank=False)

    def __str__(self):
        return '%s' % (self.name)

    class Meta:
        ordering = ['name']
        verbose_name = 'Company'
        verbose_name_plural = 'Companies'

'''
The site model consists of sites of a company as
some companies have several sites that we will work from.
'''


class SiteModel(models.Model):
    company = models.ForeignKey(CompanyModel, on_delete=models.PROTECT)
    address = models.ForeignKey(AddressModel, on_delete=models.PROTECT)
    phone = models.ForeignKey(PhoneModel, blank=True, null=True, on_delete=models.PROTECT)
    distance = models.SmallIntegerField(blank=True)

    def __str__(self):
        return '%s - %s, %s' % (self.company, self.address.city, self.address.state)

    class Meta:
        ordering = ['company']
        verbose_name = 'Company Site Information'
        verbose_name_plural = 'Company Sites'
class CompanyDetailView(DetailView):
    model = CompanyModel
    template_name = 'customers/detail.html'

    def get_context_data(self, **kwargs):
            context = super(CompanyDetailView, self).get_context_data(**kwargs)
            context['sites'] = SiteModel.objects.filter(id=self.kwargs['pk'])
            return context
   url(r'^customer/(?P<pk>[0-9a-z-]+)/detail/$', CompanyDetailView.as_view(),
       name='customer-detail'),
class ServiceReportModel(models.Model):
    report_number = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    site = models.ForeignKey(customers_models.SiteModel, on_delete=models.PROTECT, related_name='reports')
    request_number = models.ForeignKey(ServiceRequestModel,
                                       on_delete=models.PROTECT,
                                       null=True,
                                       blank=True,
                                       related_name='s_report_number'
                                       )
    reported_by = models.ForeignKey(main_models.MyUser, related_name='reports')
    reported_date = models.DateTimeField(auto_now_add=True)
    updated_by = models.ForeignKey(main_models.MyUser, blank=True, null=True, related_name='+')
    updated_date = models.DateTimeField(auto_now=True)
    equipment = models.ForeignKey(customers_models.EquipmentModel, on_delete=models.PROTECT)
    report_reason = models.CharField(max_length=255, null=True)
    time_in = models.DateTimeField(blank=True, null=True)
    time_out = models.DateTimeField(blank=True, null=True)
    actions_taken = models.TextField(null=False, blank=False)
    recommendations = models.TextField(null=True, blank=True)

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

    def __str__(self):
        return '%s - %s, %s' % (self.site.company, self.reported_date.strftime('%d %B %Y'), self.equipment.name)

    class Meta:
        ordering = ['reported_date']
        verbose_name = 'Service Report'
        verbose_name_plural = 'Service Reports'
然而,接下来的问题是,我如何深入到一层以上?继上述模型之后,我还有一个“报告”模型。但是当我使用与上面相同的方法时,它似乎在第一个模型之后就崩溃了。i、 e.我不能只使用
公司.网站.报告

型号.py

'''
The company model consists of the base company information 
'''

class CompanyModel(models.Model):
    name = models.CharField(_('Company Name'), max_length=255, blank=False)
    website = models.URLField(_('Company Website'), blank=True)
    since = models.DateField(auto_now_add=True)
    rate = models.DecimalField(max_digits=5, decimal_places=2, blank=False)

    def __str__(self):
        return '%s' % (self.name)

    class Meta:
        ordering = ['name']
        verbose_name = 'Company'
        verbose_name_plural = 'Companies'

'''
The site model consists of sites of a company as
some companies have several sites that we will work from.
'''


class SiteModel(models.Model):
    company = models.ForeignKey(CompanyModel, on_delete=models.PROTECT)
    address = models.ForeignKey(AddressModel, on_delete=models.PROTECT)
    phone = models.ForeignKey(PhoneModel, blank=True, null=True, on_delete=models.PROTECT)
    distance = models.SmallIntegerField(blank=True)

    def __str__(self):
        return '%s - %s, %s' % (self.company, self.address.city, self.address.state)

    class Meta:
        ordering = ['company']
        verbose_name = 'Company Site Information'
        verbose_name_plural = 'Company Sites'
class CompanyDetailView(DetailView):
    model = CompanyModel
    template_name = 'customers/detail.html'

    def get_context_data(self, **kwargs):
            context = super(CompanyDetailView, self).get_context_data(**kwargs)
            context['sites'] = SiteModel.objects.filter(id=self.kwargs['pk'])
            return context
   url(r'^customer/(?P<pk>[0-9a-z-]+)/detail/$', CompanyDetailView.as_view(),
       name='customer-detail'),
class ServiceReportModel(models.Model):
    report_number = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    site = models.ForeignKey(customers_models.SiteModel, on_delete=models.PROTECT, related_name='reports')
    request_number = models.ForeignKey(ServiceRequestModel,
                                       on_delete=models.PROTECT,
                                       null=True,
                                       blank=True,
                                       related_name='s_report_number'
                                       )
    reported_by = models.ForeignKey(main_models.MyUser, related_name='reports')
    reported_date = models.DateTimeField(auto_now_add=True)
    updated_by = models.ForeignKey(main_models.MyUser, blank=True, null=True, related_name='+')
    updated_date = models.DateTimeField(auto_now=True)
    equipment = models.ForeignKey(customers_models.EquipmentModel, on_delete=models.PROTECT)
    report_reason = models.CharField(max_length=255, null=True)
    time_in = models.DateTimeField(blank=True, null=True)
    time_out = models.DateTimeField(blank=True, null=True)
    actions_taken = models.TextField(null=False, blank=False)
    recommendations = models.TextField(null=True, blank=True)

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

    def __str__(self):
        return '%s - %s, %s' % (self.site.company, self.reported_date.strftime('%d %B %Y'), self.equipment.name)

    class Meta:
        ordering = ['reported_date']
        verbose_name = 'Service Report'
        verbose_name_plural = 'Service Reports'

我在一些帮助下找到了一个解决办法。我又回到了使用get_context_data方法的super'ing,接下来介绍了使用过滤器和双下划线表示法生成关系

class CompanyDetailView(DetailView):
    model = CompanyModel
    context_object_name = 'company'
    template_name = 'customers/detail.html'

    def get_context_data(self, **kwargs):
            context = super(CompanyDetailView, self).get_context_data(**kwargs)
            context['sites'] = SiteModel.objects.filter(company=self.get_object())
            context['reports'] = ServiceReportModel.objects.filter(site__company=self.get_object())
            return context

我在一些帮助下找到了一个解决办法。我又回到了使用get_context_data方法的super'ing,接下来介绍了使用过滤器和双下划线表示法生成关系

class CompanyDetailView(DetailView):
    model = CompanyModel
    context_object_name = 'company'
    template_name = 'customers/detail.html'

    def get_context_data(self, **kwargs):
            context = super(CompanyDetailView, self).get_context_data(**kwargs)
            context['sites'] = SiteModel.objects.filter(company=self.get_object())
            context['reports'] = ServiceReportModel.objects.filter(site__company=self.get_object())
            return context