Задать вопрос
allposts_vitali
@allposts_vitali

Как написать приложение django один IP один like?

Здравствуйте, я новичок в django. Я написал простое приложение и теперь хочу добавить функционал одно нажатие (лайк, голос) только для одного IP.
У меня все есть и кнопки и остальная часть приложения, волнует только реализация конкретно с IP.
Я думаю создать класс
class Usrip(models.Model):
    myip = models.IPAddressField()


И сделать зависимость в классе голосов от этого класс и класс новостей
class Choice(models.Model):
    question=models.ForeignKey(Question)
    usrip=models.ForeignKey(Usrip)
    choice_text=models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __unicode__(self):
        return self.choice_text


Правильно ли я мыслю или может есть более правильный путь подобной реализации?
  • Вопрос задан
  • 632 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@deliro
class Like(Model):
    ip = IPAddressField()

class Thing(Model):  # Вещь, которую нужно лайкать
    likes = ManyToManyField(Like)

При лайке проверяешь в БД объект модели Like с данным айпишником:
1) Если его нет, создаёшь и добавляешь к своей сущности Thing.likes.create(ip=your_ip_goes_here)
2) Если есть - получаешь этот лайк и добавляешь к Thing: Thing.likes.add(like)

В общем случае будет примерно такой кусок кода:
try:
    if not thing.likes.filter(ip=your_ip_goes_here).exists():
        like = Like.objects.get(ip=your_ip_goes_here)
        thing.likes.add(like)
except Like.DoesNotExist:
    like = thing.likes.create(ip=your_ip_goes_here)


Конечно, это лишь один из вариантов.

UPD:
Исправил ошибку в коде.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@korotkin
Во время, когда полмира сидит за NAT-ом, никак.
Частный случай - сделайте составной уникальный индекс
--
IntegerField - жирновато будет. SmallInt/ TinyInt
Попробуйте вместе с ip еще nginx user_id использовать либо какой отпечаток браузера (первая строка из гугл look-in.net/2012/08/19/browser-fingerprint)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы