Django外键未在模板中呈现相关模型数据

Posted

技术标签:

【中文标题】Django外键未在模板中呈现相关模型数据【英文标题】:Django Foreign Key Not Rendering Related Model Data In Template 【发布时间】:2018-05-08 09:43:43 【问题描述】:

编码新手,如果已经涵盖,敬请见谅。在 Django 的文档、YouTube、Google 和这里​​度过了最后几个晚上,尝试了各种方法来解决这个问题。

我有一个与司机相关的模型路线,我试图在我的模板上显示与该路线关联的相关司机的所有路线。然而,目前我能得到的只是来自 Route 模型的数据,而不是相关的 Driver。

如果我正在努力解决这个问题,我将不胜感激!

模型.py

class Driver(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    first_name = models.CharField(max_length=120, blank=True, null=True)
    last_name = models.CharField(max_length=120, blank=True, null=True)
    tel = models.CharField(max_length=120, blank=True, null=True)
    slug = models.SlugField(max_length=120, unique=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __str__(self):
        return self.first_name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.first_name)
        super(Driver, self).save(*args, **kwargs)

class Route(models.Model):
    leave_from = models.CharField(max_length=120, blank=True, null=True)
    destination = models.CharField(max_length=120, blank=True, null=True)
    date = models.DateField(auto_now_add=False, auto_now=False)
    time = models.TimeField(auto_now_add=False, auto_now=False)
    drivers = models.ForeignKey(Driver, on_delete=models.CASCADE)

    def __str__(self):
        return self.leave_from

Views.py

def drivers(request):
    qs = Route.objects.all().select_related()
    context = 
        "qs": qs,
        
    return render(request, 'drivers.html', context)

模板

% for instance in qs %
    <p> instance.user  <br>  instance.first_name   instance.last_name   instance.tel   instance.destination  </p>

    <iframe   frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/directions?origin= instance.leave_from 
    &destination= instance.destination 
    &key=AIzaSyAyuIOgVteQ0NLxCCTz4axRmta_JL3OVL4">
    </iframe>
% endfor %

我已经尝试了 .prefetch_related('driver') 和其他一些组合,但我要么只得到 Route 数据,要么出错。

提前致谢。

免责声明几天前我确实问过这个问题,但没有模板,并且在我编辑后没有得到任何进一步的答复。我只是在砖墙上,所以会很感激任何指出我哪里出错了。

【问题讨论】:

【参考方案1】:

这里:

% for instance in qs %
    <p> instance.user  <br>  instance.first_name   instance.last_name  # etc #

instance 是一个Route 对象,您要查找的属性属于Driver 对象。你想要:

% for route in qs %
    % with driver=route.drivers % # XXX should be named 'driver' #
    <p> driver.user  <br>  driver.first_name   driver.last_name  
# etc #

当我们这样做时:Route.drivers 确实应该重命名为 Route.driver(它是一个外键,而不是 many2many,所以每条路线只有一个司机,所以你需要一个单数而不是复数来表示一个集合),你应该在这里使用.select_related("driver", "driver__user")(参见What's the difference between select_related and prefetch_related in Django ORM?何时使用select_relatedprefetch_related)。

另外,当 User 中已经存在 first_namelast_name 时,是否有任何理由在 Driver 模型中复制它们?哦,是的,在Route 中,您将auto_now_add=Falseauto_now=False 添加到您的日期字段中,这是没有用的,因为它们是默认值。

【讨论】:

非常感谢您的工作!也感谢代码上的指针,非常感谢:)

以上是关于Django外键未在模板中呈现相关模型数据的主要内容,如果未能解决你的问题,请参考以下文章

spring boot jpa中的多对一映射中的外键未在子表中更新

重定向后表单未在模板中呈现(django)

Django:强制选择相关?

在 Django 模板中使用外键作为变量

models.TextField() 中的换行符未在模板中呈现

基于外键过滤数据 - Django