1đź‘Ť
Short answer: you can achieve this in Django using “native django methods”. I am not sure what exactly you mean by “native Django methods”; I am assuming that you mean making calls to the Django API.
There are a couple of ways to go about this. If your users can only create Bout
instances using a form that you provide then the form’s validation methods can test for the conditions you mentioned. For e.g.:
class BoutForm(forms.ModelForm):
class Meta:
model = Bout
def clean(self):
fighter_1 = self.cleaned_data.get('fighter_1')
fighter_2 = self.cleaned_data.get('fighter_2')
winner = self.cleaned_data.get('winner')
date = self.cleaned_data.get('date')
if not (fighter_1 and fighter_2 and (fighter_1.id != fighter_2)):
raise forms.ValidationError("Both fighters cannot be the same")
if not (winner and (winner.id == fighter_1.id or winner.id == fighter_2.id)):
raise forms.ValidationError("Winner is not in the fight")
if not (date and date < datetime.today()):
raise forms.ValidationError("Winner is not in the fight")
return self.cleaned_data
The above snippet is incomplete. You can tweak it to meet your needs. Also take a look at Django’s new fangled form validators.
If on the other hand your users can create instances using the API (say, by instantiating the Bout
class in their programs) then you’ll have to do the validation by overriding the save()
method of the Bout
class.
0đź‘Ť
While Manoj Govindan’s answer looks very good, I also came up with my own solution… I’ll include it here in case anyone finds my slightly shorter solution preferable:
def clean(self):
if self.fighter_1 == self.fighter_2:
raise ValidationError('Fighter 1 can not be Fighter 2.')
if (self.winner != self.fighter_1) and (self.winner != self.fighter_2):
raise ValidationError('Winner must be in the bout.')
if (self.date >= datetime.date.today()) and (self.winner):
raise ValidationError('Winner can not be set before match.')
- [Django]-How to display multi-word app names properly (i.e. with spaces) in Django admin?
- [Django]-Django collectstatic on S3 uploads unchanged files everytime on Heroku
- [Django]-How to expose manytomany field as a resource with tastypie?
- [Django]-ElasticSearch term suggest on analyzed field returns no suggestions