2013-06-27 3 views
1

У меня возникла интересная проблема, я не знаю, является ли она проблемой, но она не дает ожидаемого значения, которое мне нужно. Вот мои две модели, например.Добавление ManyToManyField в правильном порядке

class Name(models.Model): 
    """ """ 
    name = models.CharField(max_length=20) 


class Dir(models.Model): 
    name = models.ForeignKey(Name) 
    children = models.ManyToManyField('Dir', null=True, blank=True, related_name="dirs") 

Например, я добавил два каталога в дочерние элементы 'A', 'B'. Теперь я хочу вернуть своих двух детей в том же порядке, что и я. Но проблема в том, что она обеспечивает меня в порядке ниже. 'B', 'A'. Как сохранить порядок точно так же, как я добавил?

+0

Поскольку Django не имеет гарантии сохранения порядка вставки, когда дело доходит до полей 'm2m', вам нужно будет сделать таблицу' through' и определить порядок там. –

+0

Спасибо. Но как я могу использовать здесь, поскольку модель и ее дети имеют одно и то же имя «Dir»? Я попытался, но не могу понять, как это сделать. – user968677

+0

Вы пробовали это? класс 'DirEntry (models.Model):' ' родитель = models.ForeignKey (Dir)' ' ребенок = models.ForeignKey (Dir)' ' порядок = models.IntegerField()' Но так как для меня «ManyToManyField» с 'through' имеет слишком много ограничений - например no 'add()', 'create()' и менеджеры не будут работать (я имею в виду переопределенные 'Dir.objects' с некоторым фильтром) - лучше использовать только промежуточную модель по внешним ключам. – HighCat

ответ

-1

Вы можете заказать каталоги по идентификатору отношений:

parent = Dir(name='parent') 
parent.dirs.add(Dir(name='A')) 
parent.dirs.add(Dir(name='B')) 
children = Dir.dirs.all().order_by('id') # or '-id' if you need reverse order. 

Только если вы используете through атрибут для определения посреднических таблиц.

+1

Идентификатор ввода иногда не дает ожидаемого результата в моей структуре модели, но это были хорошие подсказки, спасибо. Теперь я определил свое собственное поле «dir_id» и назначил значение в правильном порядке во время вставки значения. Теперь я вижу правильный результат. – user968677

+0

Я использовал созданную = models.DateTimeField (auto_now_add = True) в моей промежуточной модели, чтобы узнать порядок вставки. Тогда я могу использовать .order_by ('created') –

Смежные вопросы