I have a simple model with a Model Manager:
class CompanyReviewManager(models.Manager):
def get_votes_for_company(self, company):
try:
return CompanyReview.objects.filter(user = user).count()
except ObjectDoesNotExist:
return None
def get_rating_for_field(self, installer, field):
try:
return CompanyReview.objects.filter(user = user).aggregate(Avg(field))
except ObjectDoesNotExist:
return None
class CompanyReview(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
satisfaction = models.PositiveSmallIntegerField(blank = True, null = True,)
comments = models.TextField(blank = True, null = True,)
objects = CompanyReviewManager()
def save(self, *args, **kwargs):
obj = super(InstallerReview, self).save(*args, **kwargs)
return obj
When I now try to save an object in the Django shell, the object will be saved, but nothing will be returned. Why?
In [1]: company_obj = InstallerReview()
In [2]: company_obj.user = CompanyUser.objects.all()[2]
In [3]: obj = company_obj.save()
In [4]: obj
Out[4]:
In [5]: company_obj
Out[5]: <CompanyReview: AdminCompany>
Why is the 3rd step failing without an error?
Because the super class save method doesn't return anything. It doesn't need to: self is being saved, there's no point returning something else and calling it obj.
You could just return self from your subclass save method, but there's not much point. Generally in Python, if functions change objects in-place, they do not return the changed object: compare with the list sort() method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With