django rest框架,ViewSet中的附加检查和保存以及返回不同的响应取决于条件

时间:2017-10-11 08:47:24

标签: django django-rest-framework

我正在投票。所有用户都可以在24小时内投票1次。 用户使用POST请求进行投票。 每次他投票我想查看他最后一次投票:

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

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

3 个答案:

答案 0 :(得分:2)

{}语句if后面有大括号(perform_create)。删除它们是因为它们未在Python中用于标记语句/函数等的边界。

答案 1 :(得分:2)

我认为你最好使用object-level-validation

2

答案 2 :(得分:0)

更新:我终于解决了这个问题。有很多语法错误更新代码以更正版本。可能有人需要它,所以我把它放在这里: 但是下面有一个更好的解决方案来自 Bear Brown

<强> 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)