2017-10-11 4 views
0

私は投票しています。すべてのユーザーは24時間以内に1回投票できます。 POSTリクエストでユーザーが投票しています。 彼は投票たびに、私は彼が投票の最後の時間を確認したい:django rest framework、ViewSetの追加チェックと保存、条件に応じて異なる応答が返される

彼は私が彼の票を保存する24時間以上前に投票した場合
  • 24時間未満の場合、私は悪い要求(またはこのようなもの)を返送したいと思います。

更新。私のコードには愚かな構文エラーがありました。それは誰にも興味がありません。だから私は間違ったコードを削除し、この記事を主な質問のためだけに残した。

答えて

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

ifステートメントの後に中括弧({})を入れました。perform_createです。それらが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) 
関連する問題