2016-10-16 4 views
0

В модели Django я делаю таблицу «последователь», в котором есть:модель Django: проектирование базы данных для пользователя и последователя

user's id. (this is followed by) 
user's id (this is follower) 

, что просто пользователь может следовать другим пользователям.

Как определить модель в Django?

Я попытался это, но не работает:

user = models.ForeignKey('self') 
follower_id = models.ForeignKey('self') 

Как это должно быть сделано?

благодаря

ответ

1

«я» аргумент не будет работать, если у вас есть модель под названием self.

Предполагая, что ваша модель присваивания называется Following, и вы используете встроенный в User модели, то вы можете сделать:

class Following(models.Model): 
    target = models.ForeignKey('User', related_name='followers') 
    follower = models.ForeignKey('User', related_name='targets') 

Это, вероятно, потребуется некоторая дальнейшая уникальность и проверка логики.

Примечание: related_name атрибут, см. https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ForeignKey.related_name. Это означает, что для данного пользовательского объекта вы можете сделать user.targets.all(), чтобы получить пользователей, которых они следуют, и user.followers.all(), чтобы получить пользователей, которые следуют за ними.

Обратите внимание, что Django возвращает экземпляры целевой модели, а не идентификаторы, в ORM. Это означает, что хотя базовую таблицу можно назвать follower_id, в коде python following.follower вернет фактический объект User.

+0

Я сделал this..but я получаю эту ошибку: main.followers.follower_id: (fields.E304) Обратный аксессор для столкновений «followers.follower_id» с обратным аксессором для «followers.user». \t СОВЕТ. Добавьте или измените аргумент related_name в определение «followers.follower_id» или «followers.user». – Sach

+0

и «я» для рекурсивных отношений ... правильно? – Sach

+0

А, да. Django создает обратные отношения, чтобы вы могли следить за отношениями назад. Я изменил свой ответ, чтобы добавить атрибут 'related_name'. – nimasmi