Джанго не обращает внимания на порядок звонков на add
. Неявная таблица, которую Django имеет для отношений, выглядит примерно так, если это была модель Django:
class GroupMembers(models.Model):
group = models.ForeignKey(Group)
person = models.ForeignKey(Person)
Очевидно, там нет ничего о «заказе» или о том, что вы должны прийти первым. По умолчанию он, вероятно, будет работать так, как вы описали, и вернет самый низкий pk, но это только потому, что ему больше нечего делать.
Если вы хотите принудительно исполнить ордер, вам придется использовать сквозную таблицу. По сути, вместо того, чтобы позволить Django создать эту неявную модель, вы создаете ее самостоятельно. Затем вы добавите поле типа order
для указания порядка:
class GroupMembers(models.Model):
class Meta:
ordering = ['order']
group = models.ForeignKey(Group)
person = models.ForeignKey(Person)
order = models.PositiveIntegerField(default=0)
Затем вы говорите Django использовать эту модель для отношений вместо:
class GroupMembers(models.Model):
group = models.ForeignKey(Group)
person = models.ForeignKey(Person, through='GroupMembers')
Теперь, когда вы добавляете своих участников, вы больше не можете использовать add
, потому что для завершения отношений необходима дополнительная информация. Вместо этого вы должны использовать сквозную модель:
prs = Person.objects.create(name="Tom")
GroupMembers.objects.create(person=prs, group=grp, order=1)
prs = Person.objects.create(name="Dick")
GroupMembers.objects.create(person=prs, group=grp, order=2)
prs = Person.objects.create(name="Harry")
GroupMembers.objects.create(person=prs, group=grp, order=3)
Тогда просто используйте:
Group.objects.get(id=1).members.all()[0]
В качестве альтернативы, вы можете просто добавить BooleanField
, чтобы указать, кто является основным пользователем:
class GroupMembers(models.Model):
group = models.ForeignKey(Group)
person = models.ForeignKey(Person)
is_main_user = models.BooleanField(default=False)
Затем добавьте "Том", как:
prs = Person.objects.create(name="Tom")
GroupMembers.objects.create(person=prs, group=grp, is_main_user=True)
И, наконец, получить "Том" через:
Group.objects.get(id=1).members.filter(is_main_user=True)[0]