Я пытаюсь реализовать анонимную запись на доску.
Информация анонимного пользователя (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....
Я думал о нескольких способах реализации функции анонимной записи.
Для каждого анонимного пользователясоздайте 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
и вызовет высокийзагрузить в базу данных.
Добавить 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')
и присоединиться к ним.
Есть ли более эффективный способ?