Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 31, 2009 12:32:33

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

lazy field

Подскажите посредством чего лучше реализовать такую вещь:

-Есть модель где хранится рейтинг юзеров:

class UserRating(models.Model):
user = models.ForeignKey(User)
rating = models.IntegerField(default = 0)
я хочу сделать обращение к рейтингу через модель юзера, а именно так
user.get_reating
как только происходит такой вызов выбирается UserRating для этого юзера и возвращается его рейтинг.
Те нужно написать код который бы мониторил такие обращения и автоматом привязывал нужные данные - посредством чего лучше такое сделать?



Офлайн

#2 Окт. 31, 2009 12:55:06

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

lazy field

Я думаю лучше всего через RelatedMapping:

class UserRating(models.Model):
user = models.ForeignKey(User, related_name = 'user_rating')
rating = models.IntegerField(default = 0)
Тогда при обращении к пользователю можно сделать так:
user.user_rating
Писал по памяти, подробнее здесь: http://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects



Отредактировано (Окт. 31, 2009 13:01:05)

Офлайн

#3 Окт. 31, 2009 13:32:14

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

lazy field

Попробовал что то так и не понял как через него забрать именно рейтинг, вообщем в итоге сделал так:

class UserRating(models.Model):
user = models.OneToOneField(User)
rating = models.IntegerField(default = 0)
и забирается так
user.userrating.rating

Есть еще проблема в том что у меня не у для всех User задан UserRating и вылетает DoesNotExist, как можно перехватывать это внутри как нибудь чтобы оно автоматом создавало модель, те чтобы тот кто будет пользоваться полем не ловил сам этот случай?

сначала вообще хотел так сделать:
def get_rating_(self):
return UserRating.objects.get(user = self)

User.get_rating = get_rating_
вот тут тогда легко было бы поймать исключение и создать модель внутри.
А как сделать такое с OneToOneField ?



Офлайн

#4 Ноя. 1, 2009 19:02:27

vvp91
От:
Зарегистрирован: 2009-06-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

lazy field

Evg
Есть еще проблема в том что у меня не у для всех User задан UserRating и вылетает DoesNotExist, как можно перехватывать это внутри как нибудь чтобы оно автоматом создавало модель, те чтобы тот кто будет пользоваться полем не ловил сам этот случай?
Если UserRating должен быть обязательно, то можно то можно повесить на событие сохранения User обработчик (здесь надо понимать, что пользователь сохраняется при каждом входе на сайт - меняется дата последнего входа).
В файле модели UserRating добавляем обработчик сигнала post_save, который будет создавать запись UserRating:
from django.db.models.signals import post_save

def userrating_create_handler(sender, instance, **kwargs):
UserRating.objects.get_or_create(user=instance)
post_save.connect(userrating_create_handler, sender=User)
В документации смотреть “сохранение дополнительной информации о пользователях” - http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Почитать о сигналах, почитать про get_or_create.
Удобно также сделать из подключателя к сигналам декоратор, несколько примеров декораторов к сигналам можно найти в инете.



Офлайн

#5 Ноя. 1, 2009 22:29:54

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

lazy field

vvp91
Если UserRating должен быть обязательно, то можно то можно повесить на событие сохранения User обработчик
Не совсем подходит ситуация такая что у части юзеров объект есть а у части нет. Заходит на сайт 1 юзер а на страницах например может потребоваться вывести для всех, потом обращения с кронов к этим данным если будет тоже не поможет.



Отредактировано (Ноя. 1, 2009 22:32:02)

Офлайн

#6 Ноя. 2, 2009 14:33:45

vvp91
От:
Зарегистрирован: 2009-06-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

lazy field

Evg
Не совсем подходит ситуация такая что у части юзеров объект есть а у части нет. Заходит на сайт 1 юзер а на страницах например может потребоваться вывести для всех, потом обращения с кронов к этим данным если будет тоже не поможет.
Однократный insert as select на базой данных тебя спасет.
Ты же делаешь реорганизацию базы данных, добавляя новую структуру и сущность предметной области - так и доделай эту реорганизацию до конца, включив туда однократное создание необходимых записей в новой структуре.
А обработчик сигнала пост-сейв для сущности “пользователь” у тебя будет работать для штатных действий пользователей и администраторов при корректировки записей сущности.



Офлайн

#7 Ноя. 2, 2009 19:25:56

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

lazy field

но в том то и дело чтобы не хотелось делать никаких реорганизаций а оно все самом перестроилось чтобы по мере, обращений) потом у меня немного специфичная структура юзеры общая сущность для нескольких проектов внутри каждого специфичный профиль, и когда юзер регается в одном проекте не повод создать ему сразу на всех профиль.



Отредактировано (Ноя. 2, 2009 19:27:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version