Django: Закажите модель many-many полем

Вы не можете определить язык по типу символа. И нет надежных способов сделать это.

С любым методом вы просто делаете обоснованное предположение. Есть некоторые математические статьи там

12
задан Rob Golding 1 June 2009 в 13:16
поделиться

3 ответа

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
13
ответ дан 2 December 2019 в 18:20
поделиться

Что-то вроде этого в 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.

1
ответ дан 2 December 2019 в 18:20
поделиться

Вот способ сделать это без аннотации:

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()
6
ответ дан 2 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: