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

时间:2017-11-24 11:18:44

标签: python django django-models foreign-keys

编码新手,如果已经涵盖,请致以道歉。在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')和其他一些组合,但我要么只得到路由数据,要么出错。

提前致谢。

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

1 个答案:

答案 0 :(得分:0)

下面:

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

instanceRoute个对象,您要查找的属性属于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_relatedprefetch_related)。

此外,如果first_name已存在于last_name模型中,是否有理由复制DriverUser?哦,是的,在Route中,您将auto_now_add=Falseauto_now=False添加到日期字段中,这是无用的,因为这些是默认值。