Re: M2M: How to order by a field from the `through` table?

2016-02-17 Thread 'Brutus Schraiber' via Django users


Am Dienstag, 16. Februar 2016 10:00:43 UTC+1 schrieb Brutus Schraiber:
>
> Any hints on how to archive this (prefetch + ordering on `trough` table)?
>

Prefetch(
  'notes',
  Note.objects.order_by('pinboard_pins__position'),
) 


-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/5e413eab-98ff-46fe-a385-68782a82c602%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


M2M: How to order by a field from the `through` table?

2016-02-16 Thread 'Brutus Schraiber' via Django users
Hi all…

I can't come up with a syntax to order by a field of the `trough` table in 
a many to many relationship and how to combine it with `prefetch_related`.


I have two models — _Note_ and _Pinboard_ — with a many to many 
relationship. Those two models are related trough another model — _Pin_ — 
so I can store additional information about the relationship.

I want to show the related _Note_ instances in the `DetailView` for 
_Pinboard_. That's not the problem. But I want to __prefetch__ the notes 
and also __order__ them on the `position` field from the `through` table.

Any hints on how to archive this (prefetch + ordering on `trough` table)?


# Example

This is what I have so far… it works in the sense, that I don't have to 
query for each entry, but I found no way to order the _Note_ instances by 
their `position` without more queries for each instance.


__Models__

from django.db import models


class Note(models.Model):

title = models.CharField(max_lenght=200)

content = models.TextField()


class Pinboard(models.Model):

title = models.CharField(max_lenght=200)

notes = models.ManyToManyField(
Note, blank=True, related_name='pinboards', through='Pin'
)


class Pin(models.Model):

class Meta:
ordering = ['position', ]
get_latest_by = 'position'

pinboard = models.ForeignKey(Pinboard, related_name='note_pins')

note = models.ForeignKey(Note, related_name='pinboard_pins')

position = models.PositiveSmallIntegerField(default=0)


__View__

from django.views.generic import DetailView


class PinboardDetailView(DetailView):

  model = Pinboard

  # THIS is the part, where I want the notes ordered by the position in

  queryset = Pinboard.objects.prefetch_related('notes')


__Template__

{% extends 'base.html' %}
{% block content %}
{{ pinboard.title }}
{% if pinboard.notes.all.exists %}

{% for note in pinboard.notes %}
{{ note.title }}
{% endfor %}

{% else %}
Nothing here yet…
{% endif %}
{% endblock content %}


# What else did I try

Right now I'm using the `Pin` Model for my query (with `select_related`). 
It's a workaround. I'm thinking there must be a better way, using 
`Pinboard` and `prefetch_related` seems more straight forward, but I can't 
figure out how.

BTW: It's on SO here: 
http://stackoverflow.com/questions/35410834/how-to-order-by-a-field-from-the-through-table-for-a-m2m-relationship-in-djang

Regards
-brutus

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/36d9514c-8415-4589-a221-2169f30acedb%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.