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_related
或prefetch_related
)。
另外,当 User
中已经存在 first_name
和 last_name
时,是否有任何理由在 Driver
模型中复制它们?哦,是的,在Route
中,您将auto_now_add=False
和auto_now=False
添加到您的日期字段中,这是没有用的,因为它们是默认值。
【讨论】:
非常感谢您的工作!也感谢代码上的指针,非常感谢:)以上是关于Django外键未在模板中呈现相关模型数据的主要内容,如果未能解决你的问题,请参考以下文章
spring boot jpa中的多对一映射中的外键未在子表中更新