Форум сайта python.su
Добрый день.
Знаком с Djangо всего несколько дней. Поиском по форуму и гуглом пользовался - не помогло. Нужно реализовать симметричную связь self many-to-many с возможностью хранения дополнительный данных каждой отдельной связи. Т.е. то, что в остальных случаях достигается с помощью промежуточного класса. А симметричная связь многие-ко-многим через другой класс, как я понял, невозможна.
Можно ли это сделать? Или придется использовать несимметричную связь? Спасибо.
Офлайн
Эм..а пример можно, я честно не очень понял, что вы хотите и какая проблема стоит перед вами?
Офлайн
Например, я хочу сделать возможность пользователям “дружить”. Сделать это можно так.
class Person(models.Model):
...
friends = models.ManyToManyField('self')
class Person(models.Model):
...
groups = models.ManyToManyField('Group', through='Membership')
class Group(models.Model):
...
class Membership(models.Model):
...
group = models.ForeignKey(Group)
person = models.ForeignKey(Person)
# дополнительная информация о связи
date_entered = models.DateTimeField(auto_now_add=True)
status = models.IntegerField()
persons = Group.person_set.objects.filter(membership__date_entered__year=2007)
Отредактировано (Янв. 10, 2010 07:46:03)
Офлайн
А Вы случайно http://pinaxproject.com/ не смотрели еще? Там схожий функционал реализован.
Офлайн
krasulyaПочему нельзя?
Но в django нельзя реализовать связь многие-ко-многим к себе самому через какой-то другой класс.
Офлайн
DaevaornПросто интересно - какой ответ вы ожидаете?
Почему нельзя?
krasulyaСвязь MаnyToMаny - все равно создает отдельную таблицу (на мой вкус, совершенно не нужная “фича”).
Например, я хочу сделать возможность пользователям “дружить”. Сделать это можно так.
Отредактировано (Янв. 10, 2010 17:38:31)
Офлайн
EvgIqОтдельная таблица для отображения связи есть в любом случае. Но если это автоматически создаваемая таблица ManyToMany, то в ней нет никаких полей. И если их добавить в ручную, от этого не будет пользы - их нельзя будет использовать при запросе.DaevaornПросто интересно - какой ответ вы ожидаете?
Почему нельзя?krasulyaСвязь MаnyToMаny - все равно создает отдельную таблицу (на мой вкус, совершенно не нужная “фича”).
Например, я хочу сделать возможность пользователям “дружить”. Сделать это можно так.
Конечно кому-то это может и нравится, но я предпочитаю “по старинке”
Т.е. Есть таблица - Persons, и таблица - Groups. Так же есть таблица PersonInGroup которая содержит ключи из Persons и Groups. Так же в нее вы можете включить и всю другую инфу о Person (когда он в нее вошел, какой у него в ней статус и т.п. и т.д)
class Person(models.Model):
...
class Group(models.Model):
...
class PersonInGroup(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
Офлайн
DaevaornОб этом говорится в документации. А первопричину назвать, к сожалению, не могу.krasulyaПочему нельзя?
Но в django нельзя реализовать связь многие-ко-многим к себе самому через какой-то другой класс.
class Person(models.Model):
...
friends = models.ManyToManyField('self', through='Friendship')
class Friendship(models.Model):
...
Офлайн
ziroПока нет. Посмотрю, спасибо.
А Вы случайно http://pinaxproject.com/ не смотрели еще? Там схожий функционал реализован.
Офлайн
1. Зачем вы из Person делаете ссылку на эту же таблицу Person? Да еще ManyToMany? Pesron - просто линейный список, в нем “деревья” не нужны.
2. Связь ManyToMany вам нужна между Person и Group. Вы ее создали - таблица Membership. В нее вы можете добавлять (и вроде добавили уже) все дополнительные поля про пользователя в группе.
3. Я лишь сказал, что можно все сделать и без ManyToMany. Просто вам придется тогда явно запрашивать пользователей в группе, или группы пользователя из предложенной мной таблицы PersonInGroup. Все исходные данные для этого у вас есть.
Офлайн