Hlasujem. Všetci používatelia môžu hlasovať 1 krát za 24 hodín. Užívateľ hlasujúci s požiadavkou POST. Zakaždým, keď hlasuje, chcem skontrolovať, či naposledy hlasoval:
- ak hlasoval pred viac ako 24 hodinami, chcem jeho hlas uložiť.
- ak menej ako 24 hodín chcem vrátiť zlú žiadosť (alebo niečo podobné).
UPDATE. V mojom kóde sa vyskytla len hlúpa syntaktická chyba - to nikoho nezaujíma. Preto som vymazal nesprávny kód a nechal tento príspevok len pre hlavnú otázku.
odpovede:
2 pre odpoveď č. 1Myslím, že je lepšie použiť validácia na úrovni objektu
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 pre odpoveď č. 2
Máte zložené zátvorky ({}
) po vašom if
vyhlásenie v perform_create
. Odstráňte ich, pretože sa v Pythone nepoužívajú na označenie hraníc príkazu / funkcie atď.
0 pre odpoveď č. 3
UPDATE: Tento problém konečne vyriešim. Vyskytlo sa veľa syntaktických chýb Aktualizujte kód na správnu verziu. Možno to niekto bude potrebovať, tak som to sem vložil: Nižšie však existuje lepšie riešenie z 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)