【问题标题】:Django form list field or json field?Django 表单列表字段还是 json 字段?
【发布时间】:2020-10-11 08:04:44
【问题描述】:

我有一个名为参与者的模型,如下所示

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

Votes 是用户给出的总票数,单个用户可以多次投票。如果用户已投票,则用户应等待 1 小时再次投票。现在我想知道,我如何存储用户 ID,以便更容易知道谁投票了多少次以及用户投票的最近日期和时间。

有人可以建议我或参考一些我可以解决这个问题的例子吗?

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

    您可以创建另一个模型(例如 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()
    

    【讨论】:

      【解决方案2】:

      这类问题一般通过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 查询特定参与者的投票数。

      一个基本的过滤查询就足够了。获得特定参与者的所有选票。
      类似的,

      # 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 查询来计算特定参与者的投票数或特定参与者的投票数会更容易。

      【讨论】:

        猜你喜欢
        • 2012-11-16
        • 1970-01-01
        • 2013-10-23
        • 2011-09-08
        • 2012-05-09
        • 2022-01-19
        • 2017-01-14
        • 2017-02-28
        • 2018-04-17
        相关资源
        最近更新 更多