Django обрабатывает анонимных пользователей - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь реализовать анонимную запись на доску.

Информация анонимного пользователя (IP-адрес и псевдоним) должна храниться в базе данных.

В настоящее время у меня естьUser модель и Article модель, подобная этой.

class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(_('Username'), unique=True, null=True)

    etc...

class Article(models.Model):

    id = models.AutoField(primary_key=True)
    author = models.ForeignKey(User, verbose_name=_("Author"), on_delete=models.PROTECT, null=True, blank=True)

    etc....

Я думал о нескольких способах реализации функции анонимной записи.

  1. Для каждого анонимного пользователясоздайте User только с IP-адресом и псевдонимом и установите внешний ключ для этого пользователя.

    class User(AbstractBaseUser, PermissionsMixin):
        TYPE_FIXED_USER = 0
        TYPE_ANONYMOUS = 1
    
        TYPE_CHOICES = (
            (TYPE_FIXED_USER, 'Fixed User'),
            (TYPE_ANONYMOUS, 'Annonymous'),
        )
    
        user_type = models.IntegerField(_('User type'), choices=UserType.TYPE_CHOICES)
    

    Это выглядит как самый простой способ, но я волнуюсь, что это создаст много User и вызовет высокийзагрузить в базу данных.

  2. Добавить author_type, anon_author_ip, anon_author_nick поле к Article.

    class Article(models.Model):
        TYPE_FIXED_USER = 0
        TYPE_ANONYMOUS = 1
    
        TYPE_CHOICES = (
            (TYPE_FIXED_USER, 'Fixed User'),
            (TYPE_ANONYMOUS, 'Annonymous'),
        )
    
        author_type = models.IntegerField(_('Author type'), choices=UserType.TYPE_CHOICES)
    

    Это нормально, но поиск статей по псевдониму будетсложно.Если я хочу найти пользователя 'user1234', мне придется искать Article.objects.filter(user__nickname__contains='user1234') и Article.objects.filter(anon_author_nick__contains='user1234') и присоединиться к ним.

Есть ли более эффективный способ?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

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

Если вы хотите перейти с 1 записью,пакет django-guardian создает анонимного пользователя (поскольку для его конфигурации требуется фактическая строка пользователя базы данных), вы можете прочитать об этом здесь: https://django -guardian.readthedocs.io / en / stable / configuration.html

Обратите внимание, что в Django есть что-то вроде анонимного пользователя, пользовательского объекта с is_authenticated=False.Иногда при работе с анонимными пользователями это сбивает с толку.

0 голосов
/ 02 февраля 2019

Кажется, что первый способ хорош, а не второй, не беспокойтесь о заполнении БД.

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

Я предлагаю вам использовать этот простой способ, и если вы хотите ускорить, выБД можно использовать Redis

...