Django Foreign Key Relations

Я пытаюсь установить связь между двумя таблицами Registered_Users и User_Connections, чтобы те, кто зарегистрированы, могли добавлять других в свой список подключений (больше похоже на добавление друзей). Ниже приводится содержимое файла models.py:

class Registered_Users(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=10)

    def __unicode__(self):
        return self.email

class User_Connections(models.Model):
    email = models.EmailField(blank=True)
    connection_email = models.EmailField(blank=True)
    user_connection = models.ForeignKey(Registered_Users, null=True)

    def __unicode__(self):
        return self.connection_email

То, что я пытаюсь сделать, это:

  1. получить зарегистрированного пользователя:

    ru = Registered_Users.objects.get(id=1)
    
  2. получить подключения этого зарегистрированного пользователя от User_Connection:

    uc = User_Connections.objects.filter(user_connection=ru)
    

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

Дайте мне знать, если есть лучший способ добиться этого.

ПРИМЕЧАНИЕ: идентификатор электронной почты пользовательских подключений также будет присутствовать в Registered_Users, поскольку все идентификаторы электронной почты должны быть зарегистрированы.

Ценю любую помощь. Благодарю.

2 ответа

Решение
class RegisteredUser(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=10)
    connected_users = models.ManyToManyField('self', blank=True, symmetrical=False)

    def __unicode__(self):
        return self.email

API теперь выглядит так:

ru = RegisteredUser.objects.get(id=1)
another_user = RegisteredUser.objects.get(email='name@example.com')
ru.connected_users.add(another_user)
uc = ru.connected_users.all()
for user in uc:
    print user.first_name, user.last_name, user.email

Лучший способ реализовать дружбу - это использовать ManyToManyField в Django:

Вы можете прочитать больше об этом здесь: https://docs.djangoproject.com/en/1.6/ref/models/fields/

Кроме того, чтобы устранить путаницу в запросе, с переменной 'uc' вы можете просто сделать:

uc.email для идентификатора электронной почты и uc.user_connection.first_name для имени.

Вы можете прочитать больше о Django Queries и объектах здесь: https://docs.djangoproject.com/en/1.6/topics/db/queries/

Другие вопросы по тегам