Ahsan
Ahsan

Reputation: 11832

django: How to order the queryset on a field in ManyToManyField (through) related models

I have these models

class Region (models.Model):
    name = models.CharField (max_length = 255, blank = False)

class Album(TimeStampAwareModel):
    title = models.CharField (max_length = 255, blank = False) 
    digital_release_date = models.ManyToManyField( Region, through="AlbumRegionReleaseDate", related_name="release_date_albums")
    published = models.BooleanField (default = False)
    .
    .

class AlbumRegionReleaseDate(models.Model):
   album = models.ForeignKey (Album)
   region = models.ForeignKey (Region)
   digital_release_date = models.DateField () 
   class Meta:
    ordering = ('-digital_release_date')

Suppose i have three regions i:e Europe, South Asia and North Asia

Now i want to get all "published" albums order by "digital_release_date" in Europe region?

Can anyone please tell me how to do this by SQL query?

Thanks :)

Upvotes: 5

Views: 1972

Answers (3)

marianobianchi
marianobianchi

Reputation: 8488

EDIT:

Sorry, my mistake! Now this should work. I tried it at home...

Album.objects.filter(
    published=True,
    albumregionreleasedate__region__name='Europe'
).order_by(
    'albumregionreleasedate__digital_release_date'
)

Here is some help to future doubts

Hope it works now!

Upvotes: 5

Diego Navarro
Diego Navarro

Reputation: 9704

I think you could do something like:

Region.objects.get(name='Europe').album_set.filter(published=True).order_by('digital_release_date')

Upvotes: 0

Matthew Schinckel
Matthew Schinckel

Reputation: 35619

Well, since you are using Django's ORM, you probably don't want to do it 'by SQL query'.

If you always want to order them (by default) that way, I would think the best solution would be to put an ordering attribute on your through model's Meta inner class:

class AlbumRegionReleaseDate(models.Model):
    album = models.ForeignKey(Album)
    region = models.ForeignKey(Region)
    digital_release_date = models.DateField()

    class Meta:
        ordering = ('region', 'digital_release_date')

If you want just one query that does that, without using the default ordering, ... I'll have to think some more.

Upvotes: 1

Related Questions