/ / django rest framework, Verificações e salvamentos adicionais no ViewSet e retornar uma resposta diferente depende da condição - django, django-rest-framework

django rest framework, Verificações adicionais e salvamentos no ViewSet e retorno de resposta diferente dependem da condição - django, django-rest-framework

Estou votando. Todos os usuários podem votar 1 vez em 24 horas. Usuário fazendo voto com solicitação POST. Cada vez que ele vota, quero verificar a última vez que ele votou:

  • se ele votou há mais de 24 horas, quero salvar seu voto.
  • se menos de 24 horas eu quero retornar a solicitação incorreta (ou algo assim).

ATUALIZAR. Houve apenas um erro de sintaxe estúpido em meu código - isso não é interessante para ninguém. Então, excluo meu código errado e deixei este post apenas para a pergunta principal.

Respostas:

2 para resposta № 1

eu acho melhor você usar validação de nível de objeto

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

2 para resposta № 2

Você tem chaves ({}) depois do seu if declaração em perform_create. Remova-os porque não são usados ​​em Python para marcar os limites de uma instrução / função, etc.


0 para resposta № 3

ATUALIZAÇÃO: Finalmente resolvi esse problema. Ocorreram muitos erros de sintaxe. Atualize o código para corrigir a versão. Pode ser que alguém precise, então eu coloquei aqui: Mas existe a melhor solução abaixo de 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)