2016-03-26 3 views
1

Можно ли присвоить индекс объектам в отношениях ManyToMany? Если у меня есть эти модели:Присвоить индекс ManyToMany через модель

class Group(models.Model): 
    items = models.ManyToManyField(GroupItem, unique=False, through=GroupItem) 

class GroupItem(models.Model): 
    group = models.ForeignKey(Group, unique=False) 
    index = models.IntegerField() 

Когда я создаю элемент группы, я хотел бы иметь возможность сортировать этот элемент по индексу. Так что если, например, у меня есть группа:

MyGroup = [MyItem1, MyItem2, MyItem3] 

Но я хотел бы MyItem3 быть первым товаром, как так:

MyGroup = [MyItem3, MyItem1, MyItem2] 

Как я могу это сделать? Бонус, если я могу иметь индекс автоматически увеличивается, поскольку все больше объектов будут добавлены в Group

+0

Я не получаю ваш вопрос. Если вы используете 'index' в качестве критериев сортировки, почему вы не можете сделать' order_by' для сортировки 'GroupItem'? Если вы хотите, чтобы 'MyItem3' был первым, просто сделайте его с наименьшим индексом, было бы хорошо, не так ли? –

+0

@ShangWang Я хочу избежать пробелов между индексами и автоматически увеличивать их для этой конкретной группы, к которой она принадлежит. –

+0

Я думаю, вам нужно написать некоторую логику для этого. Я сделал что-то подобное раньше, но у django нет встроенного способа сделать это. Реализация логики в сигнале 'pre_save' для модели' GroupItem' была бы способом. –

ответ

1

Вы, вероятно, можете достичь этого с помощью соответствующего по умолчанию вызываемым:

class Group(models.Model): 
    items = models.ManyToManyField(Track, through="GroupItem") 

class Track(models.Model): 
    pass 

class GroupItem(models.Model): 
    group = models.ForeignKey(Group) 
    track = models.ForeignKey(Track) 
    index = models.PositiveSmallIntegerField(default=get_index) 

def get_index(): 
    latest = GroupItem.objects.aggregate(models.Max("index")) 
    latest_index = latest["index__max"] 

    # using 0-based indexing, for example 
    return latest_index + 1 if latest_index is not None else 0 
+0

Для чего предназначена модель трека? –

+0

@SebastianOlsen: Это из вашего кода: 'ManytoManyField (Track)'. Проходная модель должна иметь «ForeignKey» с обеих сторон отношения, см. [Документация] (https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany). –

+0

О, дерьмо, главный беспорядок с моей стороны. Игнорируйте трек, который должен был сказать «GroupItem». Сейчас я отредактирую его. –

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