django: Как упорядочить набор запросов в поле в связанных моделях ManyToManyField (through) - PullRequest
5 голосов
/ 07 сентября 2011

У меня есть эти модели

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')

Предположим, у меня есть три региона: Европа, Южная Азия и Северная Азия

Теперь я хочу получить все "опубликованные" альбомы в порядке "digital_release_date" в регионе Европы?

Может кто-нибудь сказать, пожалуйста, как это сделать с помощью SQL-запроса?

Спасибо:)

Ответы [ 3 ]

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

РЕДАКТИРОВАТЬ :

Извините, моя ошибка!Теперь это должно работать.Я попробовал это дома ...

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

Здесь - некоторая помощь будущим сомнениям

Надеюсь, что это работает сейчас!

0 голосов
/ 08 сентября 2011

Я думаю, вы могли бы сделать что-то вроде:

Region.objects.get(name='Europe').album_set.filter(published=True).order_by('digital_release_date')
0 голосов
/ 07 сентября 2011

Ну, так как вы используете ORM Джанго, вы, вероятно, не хотите делать это «по SQL-запросу».

Если вы всегда хотите упорядочить их (по умолчанию) таким образом, я думаю, что лучшим решением было бы поместить атрибут упорядочения во внутренний класс Meta вашей модели:

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

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

Если вам нужен только один запрос, который делает это без использования порядка по умолчанию, ... мне придется подумать еще немного.

...