我有一种情况,我很满意两种解决方案中的任何一种,具体取决于哪种解决方案更可行/更可行。我有一个显示事件的页面。该事件的名称可能不一定正确,因此用户可以选择建议更正。这些更正存储在它们自己的表中,并具有与事件的外键关系。一旦提出建议,用户可以对该建议进行投票或投票。我需要将每个登录用户的最高投票限制为1.我不知道如何做到这一点。
我理想的解决方案:显示多达五个建议。每个登录用户都可以对这五个建议中的每一个进行投票。一旦上了。
我不太理想,但仍然可以接受的解决方案:显示多达五个建议。允许登录的用户仅在五个建议中的一个上投票或投票。
我不确定哪个更实用。我将为活动和建议的名称提供我的模型。如果您还需要查看其他内容,请与我们联系。提前谢谢!
class Event(models.Model):
def __unicode__(self):
return unicode(self.id)
id = models.BigIntegerField(blank = 'TRUE', primary_key='TRUE')
version = models.IntegerField(default = 0)
views = models.IntegerField(default = 0)
created = models.DateTimeField(editable = False)
modified = models.DateTimeField()
trained = models.BooleanField(default = False)
type = models.SmallIntegerField(default = 0)
def save(self, *args, **kwargs):
if not self.id:
self.created = datetime.datetime.today()
self.modified = datetime.datetime.today()
super(Event, self).save(*args, **kwargs)
class suggestedName(models.Model):
def __unicode__(self):
return unicode(self.name)
name = models.CharField(max_length=200, blank = 'TRUE', null = 'TRUE')
votes = models.IntegerField(default = 0)
event = models.ForeignKey(Event)
答案 0 :(得分:2)
class Vote(models.Model):
class Meta:
unique_together = (('userprofile','suggestedName'),)
userprofile = models.ForeignKey(UserProfile)
suggestedName = models.ForeignKey(suggestedName)
event = models.ForeignKey(Event)
正如一些评论建议的那样,你应该有一个User
的模型(在我的例子中,我只是假设你已经拥有)。
这款车型可以做些什么?正是你需要做的!
假设您有一个允许用户投票的视图。您要覆盖其post()
(或is_valid()
,取决于)方法,以检查用户是否可以投票:
def post(self, request, *args, **kwargs):
# - retrieve the user_profile
# - retrieve the suggestedName he voted for
# - query the votes to see if this combination of user_profile + suggestedName already exists
vote, created = Vote.objects.get_or_create(
userprofile=userprofile,
suggestedName=suggestedName,
event=event
)
# get_or_create will return a tuple
# where created is True if the method created the Vote
# False if there was a vote for this user and this name already
# You now want to use the value from 'created'
# to decide wether the vote is valid or not
if not created:
return HttpResponse('You already voted for this, cheater')
else:
return HttpResponse('Awesome, thanks for voting!')
此外,如果您只想允许每位用户投1票,请将get_or_created
传递给您检索到的用户值。
希望这些指南对您有所帮助:)