Django order_with_respect_to反向foreign_key

时间:2015-08-18 16:01:35

标签: python django django-class-based-views class-based-views

我在使用Django 1.8的CBW上遇到了麻烦。我使用CBW,如果可能的话,我想避免使用视图。但是我一直试图用默认查询来订购我的结果。

所以,更多信息和例子:在django 1.8.3上工作

有一些模特,乐队,可以在不同的场地巡回演出

myapp / models.py>

from django.db import models

class Band(models.Model):
  name = models.CharField(max_length=512)

class Venue(models.Model):
  name = models.CharField(max_length=512)
  class Meta:
    order_with_respect_to = 'VenueEvents'

class Event(models.Model):
  datetime = models.DateTimeField()
  name = models.CharField(max_length=512)
  venue = models.ForeignKey(Venue, trough='VenueEvents')
  band = models.ForeignKey(Band)
  class Meta:
    ordering ['venue', 'datetime']

myapp / view.py>

#Empty

myapp / url.py>

from django.conf.urls import url, patterns
from django.views.generic import DetailView
from myapp.models import Band

urlpatterns = patterns('',
    url(r'^bands/(?P<pk>[\d]+)$', DetailView.as_view(model=Band), name='venue')

然后直接模板文件:

template / myapp / venue_detail.html&gt;

<html><body><ul><li>
{{ band.name }}
{% for event in band.event_set.all %}
  {% ifchanged event.venue %}
    {% if not forloop.first %}
      </li><li>
    {% endif %}
    {{ event.datetime }}
  {% endif %}
  {{ event.name }}
{% endfor %}
</li></ul></body></html>

我希望在该页面上列出一个乐队在列出的所有场地,我希望它们按 event_set.datetime 排序。这意味着列出的第一个场地是他们上次参加比赛的场地。

我尝试了一些不同的东西,都没有用:

  • 通过参数添加到ForeignKey。没用?
  • 尝试将逻辑粘贴在模板中。没用(谁会这样做?)
  • 在场地:订购[&#39; event_set&#39;]

所以,我真的想要一个没有view.py的解决方案,但只有在可能的情况下。那么,解决这个问题最好的想法是什么?

  • 也许有一种简单的方法可以添加新表来帮我订购这些东西吗?
  • 也许我可以在我的班级Venue上添加一个接受乐队作为参数的方法,这将是我可以订购的东西,除了django不允许通过方法订购东西。
  • 也许我必须覆盖对象管理器以增加这种可能性,但是有一种简单的方法可以做到这一点吗?
  • 或者只是跳过无视图CBW的唯一解决方案?
  • 或者还有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

好像你使用order_with_respect_to错了。 您应该order_with_respect_to = 'venue'代替Event。 请查看https://docs.djangoproject.com/en/1.8/ref/models/options/#order-with-respect-to,看看它是如何运作的。