Ich versuche, eine benutzerdefinierte Validierung für ein Modell zu erstellen, um zu überprüfen, ob start_date
es vor dem Modell liegt und ob end_date
es nahezu unmöglich ist.
Sachen, die ich versucht habe:
eingebaute Django-Validatoren: Keine Überprüfung
schreibe meine eigenen, so:
def validate_date(self): if self.start_date < self.end_date: raise serializers.ValidationError("End date must be after start date.")
Dieses Stück Code habe ich der Serializer-Klasse (und dann dem Modell) hinzugefügt, aber es scheint an keiner Stelle aufgerufen zu werden.
Ich habe auch diesen Code gefunden, der möglicherweise von Nutzen ist, aber ich weiß nicht, wie ich ihn in meine Methode integrieren soll. Es scheint, dass es funktionieren würde, ein Modellattribut zu validieren, aber ich muss zwischen zwei Attributen prüfen.
Mein Modell:
class MyModel(models.Model):
created = models.DateTimeField(auto_now_add=True)
relation_model = models.ForeignKey(RelationModel, related_name="mymodels")
priority = models.IntegerField(
validators = [validators.MinValueValidator(0), validators.MaxValueValidator(100)])
start_date = models.DateField()
end_date = models.DateField()
@property
def is_active(self):
today = datetime.date.today()
return (today >= self.start_date) and (today <= self.end_date)
def __unicode__(self):
...
class Meta:
unique_together = ('relation_model', 'priority', 'start_date', 'end_date')
Zu Ihrer Information, alle anderen Validierungen funktionieren!
Mein Serializer:
class MyModelSerializer(serializers.ModelSerializer):
relation_model = RelationModelSerializer
is_active = serializers.Field(source='is_active')
def validate_date(self):
if self.start_date > self.end_date:
raise serializers.ValidationError("End date must be after start date.")
class Meta:
model = MyModel
fields = (
'id', 'relation_model', 'priority', 'start_date', 'end_date', 'is_active'
)
Meine Sicht:
class MyModelList(generics.ListCreateAPIView):
permission_classes = (IsAdminUser,)
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
ordering = ('priority')