编码新手,如果已经涵盖,请致以道歉。在Django的文档,YouTube,Google上花了最后几个晚上,并在这里尝试各种方法来解决这个问题。
我有一个与Driver有关的模型Route,我试图在我的模板上显示与该路径相关的相关驱动程序的所有路径。但是目前我所能得到的只是路由模型中的数据,而不是相关的驱动程序。
感谢任何帮助,因为我正在努力解决这个问题!
Models.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 width="600" height="450" 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')和其他一些组合,但我要么只得到路由数据,要么出错。
提前致谢。
免责声明我确实在几天前问了这个问题,但没有模板,在我编辑之后没有得到任何进一步的回复。我只是在一堵砖墙所以会很感激指出我哪里出错了。
答案 0 :(得分:0)
下面:
{% 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
(它是一个外键,而不是很多,所以每条路线只有一个驱动程序,所以你想要一个单数而不是表示集合的复数形式,你应该在这里使用.select_related("driver", "driver__user")
(参考What's the difference between select_related and prefetch_related in Django ORM?了解何时使用select_related
或prefetch_related
)。
此外,如果first_name
已存在于last_name
模型中,是否有理由复制Driver
和User
?哦,是的,在Route
中,您将auto_now_add=False
和auto_now=False
添加到日期字段中,这是无用的,因为这些是默认值。