2017-10-11 31 views
0

我正在进行投票。所有用户可以在24小时内投票1次。 用户使用POST请求进行投票。 每次他投票我想检查他上次投的票:django rest框架,在ViewSet中额外的检查和保存并返回不同的响应取决于条件

  • 如果他24小时前投票我想保存他的投票。
  • 如果少于24小时我想返回错误的请求(或类似的东西)。

UPDATE。我的代码中只有一个愚蠢的语法错误 - 这对任何人都不感兴趣。所以我删除了我的错误代码,并留下这篇文章只是为了主要问题。

回答

2

我想你更好地使用object-level-validation

class VoteAddSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Vote 
     exclude =('id','created_date','user',) 

    def validate(self, data): 
     request = self.context.get('request') 
     vote_date = request.user.profile.vote_date 
     if vote_date + timedelta(days=1) > timezone.now(): 
      raise serializers.ValidationError("You need wait to vote again") 
     return data 
+0

谢谢,那真是比我更好的解决方案。 – yestema

+0

很高兴为您效劳! –

2

perform_createif声明后面有大括号({})。删除这些,因为它们不是用Python来标记语句/函数的边界等。

+0

感谢你是对的。有很多错误,当我看到你的答案时,我已经找到了它,但是在任何地方都谢谢你。 我不确定自己从一开始就做出正确的方式,现在我已经修复了所有错误并且它可以正常工作,所以我在此发布了工作代码作为答案。 – yestema

+0

@yestema请考虑关注Bear Brown的建议! –

0

更新:我终于解决了这个问题。有很多语法错误更新代码以更正版本。可能有人会需要它,所以我一直把它放在这里: 但有从熊布朗

views.py下面更好的解决方案:

class VoteAddViewSet(viewsets.ModelViewSet): 
    queryset = Vote.objects.all() 
    serializer_class = VoteAddSerializer 
    http_method_names = ['post',] 

    def perform_create(self, serializer): 
     profile = Profile.objects.get(pk=self.request.user.id) 
     allow_vote_date = profile.vote_date + timedelta(days=1) 
     if (allow_vote_date < timezone.now()): 
      profile.vote_date = timezone.now() 
      profile.save() 
      serializer.save(user=self.request.user) 
     else: 
      return Response(status=status.HTTP_400_BAD_REQUEST) 

serializers.py:

class VoteAddSerializer(serializers.ModelSerializer): 
class Meta: 
    model = Vote 
    exclude =('id','created_date','user',) 

urls.py:

router = routers.DefaultRouter() 
router.register(r'vote_add', views.VoteAddViewSet, 'vote_add') 
urlpatterns = [ url(r'^', include(router.urls)),] 

models.py

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') 
    vote_date = models.DateTimeField(default=None, null=True, blank=True) 

class Girl (models.Model): 
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.SET_NULL) 
    title = models.CharField(max_length=120, null=True, blank=True) 
    pic = models.ImageField(upload_to='girls/pic1/', blank=True, default=None) 

class Vote (models.Model): 
    user = models.ForeignKey(User, null=True, blank=True, related_name='girls_user_voted_for', on_delete=models.SET_NULL) 
    girl = models.ForeignKey(Girl, null=True, blank=True, related_name='supporters_of_this_girl', on_delete=models.SET_NULL) 
    created_date = models.DateTimeField(default=timezone.now) 
    def __unicode__(self): 
     return u'{}'.format(self.id) 
相关问题