У меня есть модель Django, которая имеет два отношения «многие ко многим» с классом auth.User
, например:
class Indicator(models.Model):
friends = models.ManyToManyField(User, related_name="+")
enemies = models.ManyToManyField(User, related_name="+")
related_name установлено в "+" , поэтому нет обратной связи , т.е. мне не нужны u.friends_set
и u.enemies_set
, если вы пользователь.
Добавление, удаление и очистка «друзей» и «врагов» работает нормально - если я проверяю непосредственно в базе данных (т.е. не через Django), я вижу изменения, отраженные так, как я и ожидал. Однако, если я получаю запрос, заданный через Django, я получаю список «врагов», использую ли я i.friends.all()
или i.enemies.all()
(при условии, что i
является экземпляром индикатора).
Если я проверю ManyRelatedManager, я вижу, что атрибут through
является правильным, что (если я правильно понимаю) позволяет корректно работать add / remove / clear:
>>> i.friends.through
<class 'project.app.models.Indicator_friends'>
Однако метод get_query_set
в основном получает суперкласс (диспетчер пользователей) и вызывает для него фильтр с kwargs i.friends.core_filters
, равным {'+__pk': 404L}
(если идентификатор индикатора равен 404). Core_filters одинаковы как для «друзей», так и для «врагов», что объясняет, почему я неправильно получаю один и тот же набор запросов для обоих.
Я могу обойти это (без установки related_name): вместо i.friends.all()
я могу использовать:
[friend.user for friend in i.friends.through.objects.filter(indicator__id=i.id)]
Однако это вряд ли изящно.
- Это ограничение системы Django "set related_name to '+'"? (Я не смог найти это нигде в документации), т. Е. Что вы можете использовать «+» только один раз для каждой отдельной пары «объект / объект»?
- Это ошибка в Django (то есть что-то для отчета )?
- Есть ли лучший способ обойти эту проблему?
(Django 1.3 - я не пробовал транк, но при чтении кода он выглядит так же, как в Python 2.7).