Django поле списка формы или json поле? - PullRequest
0 голосов
/ 21 июня 2020

У меня есть модель, называемая участниками, как показано ниже

class participants(models.Model):
     username= models.CharField(max_length =50)
     votes = models.IntegerField(default=0)
     voted_by = ?

Голоса - это общее количество голосов, отданных пользователями, и один пользователь может голосовать несколько раз. Если пользователь проголосовал, он должен подождать 1 час, чтобы проголосовать снова. Теперь мне интересно, как я могу хранить идентификатор пользователя таким образом, чтобы было легче узнать, кто голосовал, сколько раз, а также дату и время, когда пользователь проголосовал.

Может ли кто-нибудь предложить мне или порекомендовать некоторых примеры, которые я могу решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Проблема такого рода обычно решается с помощью ссылки ForeignKey.

# class name should begin with a capital letter and should be singular for a model
class Participant(models.Model):
     username = models.CharField(max_length =50)


class Vote(models.Model)
    vote_to = models.ForeignKey(Participant, on_delete=models.CASCADE, related_name='vote_to')
    voted_by = models.ForeignKey(Participant, on_delete=models.CASCADE, related_name='voted_by')
    date_time = models.DateTimeField(auto_now=True)

Каждый голос , сделанный участником , будет строкой в Votes таблица или объект типа Vote. Что-то вроде

vote = Vote(vote_to=some_participant_object,
            voted_by=someother_participant_object)
vote.save()

auto_now=True означает, что значение будет добавлено при создании объекта, поэтому вам не нужно обрабатывать, когда голосование было отдано.

Затем вы можете запросить количество голосов, отданных конкретным участником с использованием ORM.

Базового запроса c должно быть достаточно. Получите все голоса конкретного участника. Что-то вроде

# just as an idea here, the next lines might not be perfect
votes = Vote.objects.filter(voted_by__id=some_participant_id)
# or
votes = Vote.objects.filter(voted_by=some_participant_object)
# check the timestamp of the last vote and build logic accordingly

Таким образом будет проще писать запросы ORM для подсчета количества голосов, которые имеет конкретный участник, или количества голосов, отданных конкретным участником.

0 голосов
/ 21 июня 2020

Вы можете создать другую модель (например, VotesHistory) ...

class VotesHistory(models.Model):
    class Meta:
        verbose_name = "Vote Log"
        verbose_name_plural = "Vote Logs"

    time = models.DateTimeField(auto_now=True, verbose_name="Time")
    uid = models.IntegerField(verbose_name="Voter's UserID")
    pid = models.IntegerField(verbose_name="Voted UserID")

Теперь, когда пользователь 1 проголосует за пользователя 2, вы можете создать запись, например,

VotesHistory(uid=user1.id, pid=user2.id).save()
...