SirAnthony 02.03.2011 14:34

Пстач, я тебе принес ДЖАНГОПРОБЛЕМУ:
class AnimeItem(models.Model):
bundles = models.ManyToManyField('self')
>>> a = AnimeItem.objects.get(id=1)
>>> b = AnimeItem.objects.get(id=2)
>>> c = AnimeItem.objects.get(id=3)
>>> a.bundles.add(b)
>>> b.bundles.all()
[<AnimeItem: 2x2=Shinobuden [TV]>]
>>> c.bundles.add(a)
>>> b.bundles.all()
[<AnimeItem: 2x2=Shinobuden [TV]>]
>>> a.bundles.all()
[<AnimeItem: 5 Centimeters per Second [Movie]>, <AnimeItem: 801 TTS Airbats [OAV]>]
Как связать все три штуки вместе без костылей?

1. werehuman 02.03.2011 15:17

Нифига не понятно, что ты сделать хотел. Чтобы при запросе a.bundles.all() получить все анимешки, принадлежащие a, а также все анимешки, принадлежащие анимешкам, принадлежащим a и т.д.? Полный обход дерева связей в общем?
AFAIK нативно такую фишку умеют только postgresql и oracle. Так что тебе проще сделать костыль типа (пардон, на джанге давно не писал, так что пример — чисто на понимание) http://pastebin.com/Vx55aB3t

2. SirAnthonywerehuman /1 02.03.2011 15:20 Home

Вообще цель — сделать список связанных друг сдругом сущностей, чтобы туда можно было добавлять объекты, и a будет связано с б если б связано с ц, которое связано с а. Предолжили сделать костыль через fk, пробую.

3. werehumanSirAnthony /2 02.03.2011 15:25 lithium

ну я тебе показал как сделать обход графа в ширину. А тебе нужно определить циклические зависимости? (то есть когда элементы со своими указателями выстраиваются в круг)

4. werehumanwerehuman /3 02.03.2011 15:29 lithium

поиск циклов — это уже делается через поиск в глубину. А сначала подумай — оно тебе действительно надо? Вообще неслабая будет нагрузочка на бд, если у тебя будет 500 связанных таким способом анимешек.

5. SirAnthonywerehuman /3 02.03.2011 15:30 Home

Я не знаю, как это правильно назвать, но это скорее больше похоже на шину, чем на кольцо.

6. SirAnthonywerehuman /4 02.03.2011 15:34 Home

Вот как раз этого я и пытаюсь избежать. Когда я искал оптимальный вариант, я пришел к тому, что делал таблицу, в которой одна из записей была главной, а остальные связывались с ней(что-то вроде id mainid elementid), а сейчас, перенося на джангу, думаю, как лучше это отрефакторить, чтобы было проще с ним работать.

7. werehumanSirAnthony /5 02.03.2011 15:36 lithium

эээ... http://pastebin.com/Vx55aB3t

8. SirAnthonywerehuman /7 02.03.2011 15:38 Home

Что-то ты переусложняешь, мне кажется.

9. werehumanSirAnthony /8 02.03.2011 15:38 lithium

нарисуй как хочешь

10. SirAnthonywerehuman /9 02.03.2011 15:45 Home

Я попробовал, но рисунок получился какой-то путанный. Лучше представить вместо компьютеров элементы:

11. werehumanSirAnthony /10 02.03.2011 15:46 lithium

тогда смотри тот вариант, который я предложил первым

12. SirAnthonywerehuman /11 02.03.2011 16:29

Все свелось к
class AnimeBundle(models.Model):
pass
class AnimeItem(models.Model):
bundle = models.ForeignKey(AnimeBundle, related_name='animeitems', null=True, blank=True)

>>> a = AnimeItem.objects.get(id=1)
>>> b = AnimeItem.objects.get(id=2)
>>> bd = AnimeBundle()
>>> bd.save()
>>> a.bundle = bd
>>> a.save()
>>> b.bundle = bd
>>> b.save()
>>> a.bundle.animeitems.all()
[<AnimeItem: 2x2=Shinobuden [TV]>, <AnimeItem: 5 Centimeters per Second [Movie]>]
>>> c = AnimeItem.objects.get(id=3)
>>> c.bundle = b.bundle
>>> c.save()
>>> a.bundle.animeitems.all()
[<AnimeItem: 2x2=Shinobuden [TV]>, <AnimeItem: 5 Centimeters per Second [Movie]>, <AnimeItem: 801 TTS Airbats [OAV]>]
Т.е. я не пытаюсь связать их между собой, а привязываю к значениям другой таблицы.

Do you really want to delete ?