order_by () не работает с filter () в представлении Django - PullRequest
7 голосов
/ 24 мая 2011

Моя модель:

...
class Bild(models.Model):
    album = models.ForeignKey(Album)
    slot = models.IntegerField()
    bild = models.ImageField(upload_to='bilder', null=True)
    untertitel = models.CharField(max_length=200, null=True)
    def __unicode__(self):

Мой взгляд:

def album_bild(request, album_id, bild_id):
    album_id = int(album_id)
    bilder = Bild.objects.filter(album__id = album_id).order_by('slot')
    ....

Когда я перебираю "bilder" в шаблоне, я вижу, что filter () работал, но объекты по-прежнему упорядочены pk вместо "slot".

Есть ли проблема с моим использованием filter () и order_by ()?

РЕДАКТИРОВАТЬ: Я думаю, я должен добавить, что все работает нормально в оболочке. Так может ошибка в шаблоне ...?

{% for bild in bilder %}
    <li 
    {% ifequal bild.slot bild_id %}
            class="active" 
    {% endifequal %}
    onclick="window.location.href='/portfolio/{{ album_id }}/{{ bild.slot }}'"><div>{{ bild.slot }}</div></li>
{% endfor %}

{% for i in empties %}
    <li class="empty"></li>
{% endfor %}

Ответы [ 3 ]

11 голосов
/ 24 мая 2011

Я сделал много цепочек .filter().order_by(), как и у вас там, и ничто не выскакивает мне как неуместное. Я никогда не пытался перенести это упорядочение в шаблон без дальнейшей обработки объектов (хотя обычно итерируем по ним), поэтому мне интересно, потеряно ли order_by() как часть ленивой оценки django? Может быть, попробуйте обернуть строку filter().order_by() в list(), чтобы вызвать там оценку, а не откладывать ее на более позднее время?

bilder = list(Bild.objects.filter(album__id = album_id).order_by('slot'))

Это выстрел в темноте, но достаточно быстрый, чтобы стоить попробовать.

5 голосов
/ 15 июня 2012

Вы должны попробовать заказать по slot__id.

Как это:

bilder = Bild.objects.filter(album__id = album_id).order_by('slot__id')
0 голосов
/ 18 июля 2018

В вашем views.py Вам не нужно использовать

filter(album__id = album_id)

(с двойным подчеркиванием) поскольку «Альбом» не относится к ManyToManyField

здесь 'Альбом' это просто ForeignKey

поэтому views.py должно иметь

def album_bild(request, album_id, bild_id):
    album_id_local = int(album_id)
    bilder = Bild.objects.filter(album_id=album_id_local).order_by('slot')
    ....

(с одним подчеркиванием).

ссылка на django doc: https://docs.djangoproject.com/en/2.0/topics/db/queries/#lookups-that-span-relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...