0

私には状況があり、どちらがより実現可能/可能であるかに応じて、2 つの解決策のいずれかに満足しています。イベントを表示するページがあります。そのイベントの名前は必ずしも正しいとは限らないため、ユーザーは修正を提案することができます。これらの修正は、イベントへの外部キー関係を持つ独自のテーブルに格納されます。提案が行われると、ユーザーはその提案に対して賛成または反対の投票を行うことができます。ログインしている各ユーザーの最大投票数を 1 に制限する必要があります。これを行う方法がまったくわかりません。

私の理想的な解決策: 5 つもの候補が表示されます。ログインしている各ユーザーは、これら 5 つの提案のそれぞれに投票できます。それぞれに1回。

あまり理想的ではありませんが、それでも許容できる解決策: 5 つもの候補が表示されます。ログインしたユーザーは、5 つの提案のうち 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)
4

1 に答える 1

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、取得したユーザー値のみに渡します。

これらのガイドラインが少しでもお役に立てば幸いです :)

于 2013-07-25T17:40:58.077 に答える