Django Framework « Сложная сортировка при выборке данных. Django ORM

Добрый день.
Есть такая модель:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .python.geshi_code {font-family:monospace;} .python.geshi_code .imp {font-weight: bold; color: red;} .python.geshi_code .kw1 {color: #ff7700;font-weight:bold;} .python.geshi_code .kw2 {color: #008000;} .python.geshi_code .kw3 {color: #dc143c;} .python.geshi_code .kw4 {color: #0000cd;} .python.geshi_code .co1 {color: #808080; font-style: italic;} .python.geshi_code .coMULTI {color: #808080; font-style: italic;} .python.geshi_code .es0 {color: #000099; font-weight: bold;} .python.geshi_code .br0 {color: black;} .python.geshi_code .sy0 {color: #66cc66;} .python.geshi_code .st0 {color: #483d8b;} .python.geshi_code .nu0 {color: #ff4500;} .python.geshi_code .me1 {color: black;} .python.geshi_code span.xtra { display:block; }

class City(models.Model):
    name = models.CharField() # название города
    country = models.CharField() # сдесь 2-х буквенный код страны ru,ua,by,...
    population = models.IntegerField() # число жителей
 
Мне нужно сделать выборку городов имя которых начинается с заданной буквы, отсортировав выборку по убыванию населения, но при этом чтобы например российские города были вверху списка. Как это лучше сделать, если вообще возможно ? Например такой запрос:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .python.geshi_code {font-family:monospace;} .python.geshi_code .imp {font-weight: bold; color: red;} .python.geshi_code .kw1 {color: #ff7700;font-weight:bold;} .python.geshi_code .kw2 {color: #008000;} .python.geshi_code .kw3 {color: #dc143c;} .python.geshi_code .kw4 {color: #0000cd;} .python.geshi_code .co1 {color: #808080; font-style: italic;} .python.geshi_code .coMULTI {color: #808080; font-style: italic;} .python.geshi_code .es0 {color: #000099; font-weight: bold;} .python.geshi_code .br0 {color: black;} .python.geshi_code .sy0 {color: #66cc66;} .python.geshi_code .st0 {color: #483d8b;} .python.geshi_code .nu0 {color: #ff4500;} .python.geshi_code .me1 {color: black;} .python.geshi_code span.xtra { display:block; }

citys = City.objects.filter(name__istartswith=s).order_by('-population')[:10]
 
отсортирует только по населению, а вот как теперь города с определённым кодом страны переместить вверх списка не понятно. Может для этого нужна специальная структура БД ? В дальнейшем хотелось бы определять по IP пользователя страну, и соответствующие города перемещать вверх списка.
Заранее спасибо.

1 ответов


Напрашивается новая структура данных:


class City(models.Model):
    """
    Города
    """

    name = models.CharField() # название города
    country = models.ForeignKey(Country) # страна
    population = models.IntegerField() # число жителей

class Country(models.Model):
    """
    Страны
    """

    code = models.CharField() #  # сдесь 2-х буквенный код страны ru,ua,by,...
    priority = models.IntegerField() # приоритет
 
Тогда выбрка будет более естественной:

cities = City.objects.filter(name__istartswith=s).order_by('-population', 'country__priority')[:10]