2012-10-02 4 views
2

Я экспериментирую с Django, и я пытаюсь выяснить, как определить отношение многих ко многим, связанное с одной сущностью. Скажем, например, у меня есть пользовательский объект пользователя, называемый «Myuser». Я хочу MyUser иметь список друзей, которые также типа MyUser:Django Many to Many friends relationship

class Myuser(models.Model): 
    user = models.OneToOneField(User) 
    username = models.CharField(max_length=200) 
    last_login = DateTimeField(blank=True) 
    is_active = BooleanField(default=True) 
    birthday = models.DateField() 
    name = models.CharField(max_length=200) 
    friends = models.ManyToManyField(Myuser) 
    objects = MyuserManager() 

    def __init__(self, *args, **kwargs): 
     super(Myuser, self).__init__(*args, **kwargs) 
     self.myuser = self 


    def __unicode__(self): 
     return self.name 

    def is_authenticated(self): 
     return self.user.is_authenticated() 

Это не будет работать, потому что MyUser не определен в объеме друзей. Итак, как бы я определил такие отношения?

ответ

4

Django имеет специальный синтаксис для полей Many-to-many из модели для себя.

От the documentation, вы хотели бы использовать что-то подобное в вашей модели:

friends = models.ManyToManyField('self') 

В общем, Django не имеет проблем с определения поле для моделей, которые находятся вне сферы, или какую гавань еще не определено. Решение состоит в том, чтобы называть модель строкой, и это имя разрешается после определения другой модели. Это необходимо при определении двух моделей, имеющих, например, внешние ключи друг к другу. 'self' - особый случай, однако, для отношений обратно к модели, которую вы в настоящее время определяете.

+0

Есть ли онлайн-учебники или документы, объясняющие, как правильно настроить такие отношения? Я могу синхронизировать с помощью специального значения «я», но когда я пытаюсь загрузить пользовательский пользователь в представлении администратора, я получаю ошибки: «отношение« myuser_myuser_friends »не существует LINE 1: ... yuser«. »Name «FROM» myuser_myuser «INNER JOIN» myuser _... » – Cliff

+0

Опубликуйте свою модель и свои классы администратора, и я уверен, что я (или кто-то другой здесь) сможет помочь. Если вы работаете с syncdb, вы почти наверняка находитесь почти на всем пути. –

+0

Я не знаю, работает ли он так, как ожидалось. Модель такая же, как и выше. После запуска syncdb я, похоже, не добавил «myuser_myuser_friends» в мою схему db. При отладке и сбое, когда приложение пытается выполнить этот SQL: «SELECT» myuser_myuser ». Id, myuser_myuser. User_id, . «is_active», «myuser_myuser». «день рождения», «myuser_myuser». «name» FROM «myuser_myuser» INNER JOIN «myuser_myuser_friends» ON («myuser_myuser». «id» = «myuser_myuser_friends». «to_myuser_id») ГДЕ «myuser_myuser_friends» ". from_myuser_id" = 32 " – Cliff