Найти - Пользователи
Полная версия: lazy field
Начало » Django » lazy field
1
Evg
Подскажите посредством чего лучше реализовать такую вещь:

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

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 ?
vvp91
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.
Удобно также сделать из подключателя к сигналам декоратор, несколько примеров декораторов к сигналам можно найти в инете.
Evg
vvp91
Если UserRating должен быть обязательно, то можно то можно повесить на событие сохранения User обработчик
Не совсем подходит ситуация такая что у части юзеров объект есть а у части нет. Заходит на сайт 1 юзер а на страницах например может потребоваться вывести для всех, потом обращения с кронов к этим данным если будет тоже не поможет.
vvp91
Evg
Не совсем подходит ситуация такая что у части юзеров объект есть а у части нет. Заходит на сайт 1 юзер а на страницах например может потребоваться вывести для всех, потом обращения с кронов к этим данным если будет тоже не поможет.
Однократный insert as select на базой данных тебя спасет.
Ты же делаешь реорганизацию базы данных, добавляя новую структуру и сущность предметной области - так и доделай эту реорганизацию до конца, включив туда однократное создание необходимых записей в новой структуре.
А обработчик сигнала пост-сейв для сущности “пользователь” у тебя будет работать для штатных действий пользователей и администраторов при корректировки записей сущности.
Evg
но в том то и дело чтобы не хотелось делать никаких реорганизаций а оно все самом перестроилось чтобы по мере, обращений) потом у меня немного специфичная структура юзеры общая сущность для нескольких проектов внутри каждого специфичный профиль, и когда юзер регается в одном проекте не повод создать ему сразу на всех профиль.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB