2010-02-11 1 views
2

Скажем, у меня есть модель с внешним ключом для пользователя Джанго Auth:Как вы можете получить доступ к «вызывающему» объекту через СвязанныйManager в Django?

class Something(models.Model): 

    user = models.ForeignKey(User, related_name='something') 

Затем я могу получить доступ к этой модели через RelatedManager:

u = User.objects.create_user('richardhenry', '[email protected]', 'password') 
u.something.all() 

Мой вопрос, если я создаю SomethingManager и определить некоторые его методы:

class SomethingManager(models.Manager): 

    def do_something(self): 
     pass 

можно ли получить исходный объект пользователя (как, переменная u) в методе do_something()? (Через связанного менеджера, передавая его через метод args, я не то, что мне нужно.)

ответ

2

Менеджеры подключаются напрямую к модели, которой они управляют. Поэтому в этом случае ваш менеджер будет подключен к Something, но не напрямую к User.

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

Имейте в виду, что для использования ваших собственных методов с помощью соответствующего администратора вам необходимо установить use_for_related_fields = True в вашем Менеджере.

Таким образом, чтобы пользователю, вы должны быть немного окольными и получить объект, то пользователь:

def do_something(
    ids = self.get_query_set().values_list('user__id', flat=True) 
    return User.objects.filter(id__in=ids).distinct() 

выше должен возвращать только один пользователь, вы можете добавить .get() в конце, чтобы получить объект вместо набора запросов, но мне нравится возвращать запросы, так как вы можете сохранить их цепочку.

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