2015-10-06 4 views
1

У меня есть две модели, одна из которых (Bar) имеет две связи M2M, указывающие на Foo.ManyToManyField.add не имеет эффекта

class Foo(Model): 
    pass # Whatever 

class Bar(Model): 
    foos = ManyToManyField(
     Foo, blank=True, related_name="+") 
    bazs = ManyToManyField(
     Foo, blank=True, related_name="+") 

После создания проекта с помощью Django 1.8, ни один из этих полей не работают .add() методы, так как demonstated ниже.

In [1]: foo = Foo.objects.first() 
Out[2]: <Foo: ...> 

In [3]: bar = Bar.objects.first() 
Out[4]: <Bar: ...> 

In [8]: bar.foos.add(foo) 

In [9]: bar.foos.all() 
Out[9]: [] 

In [11]: bar.save() 

In [12]: bar.foos.all() 
Out[12]: [] 

Документация ManyToManyField является here.

Документация для related_name: here. Используется потому, что обратные связанные имена для Bar в противном случае конфликтуют с Foo.

Каково рекомендуемое решение?

+0

Вы пытались изменить 'related_name'? Используйте разные для каждого поля. – Gocht

+0

@Gocht Да, я пробовал это. Это создает обратные отношения от Foo to Bar, что не то, что мы/я хочу в этом случае – Brian

+0

Одна вещь, которую вам нужно иметь в виду при добавлении объектов в поле M2M, заключается в том, что добавленный объект (foo в этом случае) должен быть предварительно сохранен, не так ли? – Gocht

ответ

1

Я согласен с Гохтом в том, что он, скорее всего, имеет какое-то отношение к атрибутам related_name, имеющих одинаковое значение. На основании вашего комментария кажется, что вы ищете поле ForeignKey, а не ManyToManyField. Если вам нужен только один путь от Bar до Foo, это будет лучший выбор.

Была ли еще одна причина, по которой вы не использовали этот тип поля?

Недостаточно баллов, чтобы прокомментировать ваш комментарий, иначе я бы поставил его там. :(

+0

Да, несколько 'Bar' нужно указывать на несколько 'Foo', поэтому 'ForeignKey's ограничивает вариант M: 1. – Brian

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