Вы не можете определить язык по типу символа. И нет надежных способов сделать это.
С любым методом вы просто делаете обоснованное предположение. Есть некоторые математические статьи там
Django 1.1 (в настоящее время бета) добавляет поддержку агрегации . Ваш запрос может быть выполнен примерно так:
from django.db.models import Max
People.objects.annotate(max_weight=Max('roles__weight')).order_by('-max_weight')
Это сортирует людей по их наиболее тяжелым ролям, без возврата дубликатов.
Сгенерированный запрос:
SELECT people.id, people.name, MAX(role.weight) AS max_weight
FROM people LEFT OUTER JOIN people_roles ON (people.id = people_roles.people_id)
LEFT OUTER JOIN role ON (people_roles.role_id = role.id)
GROUP BY people.id, people.name
ORDER BY max_weight DESC
Что-то вроде этого в SQL:
select p.*, max (r.Weight) as HeaviestWeight
from persons p
inner join RolePersons rp on p.id = rp.PersonID
innerjoin Roles r on rp.RoleID = r.id
group by p.*
order by HeaviestWeight desc
Примечание: группировка по стр. * Может быть запрещена вашим диалектом SQL. Если да, просто перечислите все столбцы в таблице p, которые вы собираетесь использовать в предложении select.
Примечание: если вы просто группируете по p.ID, вы не сможете вызывать другие столбцы в p в предложении select.
Я не знаю, как это взаимодействует с Django.
Вот способ сделать это без аннотации:
class Role(models.Model):
pass
class PersonRole(models.Model):
weight = models.IntegerField()
person = models.ForeignKey('Person')
role = models.ForeignKey(Role)
class Meta:
# if you have an inline configured in the admin, this will
# make the roles order properly
ordering = ['weight']
class Person(models.Model):
roles = models.ManyToManyField('Role', through='PersonRole')
def ordered_roles(self):
"Return a properly ordered set of roles"
return self.roles.all().order_by('personrole__weight')
Это позволяет вам сказать что-то вроде:
>>> person = Person.objects.get(id=1)
>>> roles = person.ordered_roles()