Reputation: 6781
I'm working with Django.
I have a model called Agrument. Arguments have sides and owners. I have a function that returns back the side of the most recent argument of a certain user.
like obj.get_current_side(username)
I've added this to the actual Argument model like this
def get_current_side(self, user):
return self.argument_set.latest('pub_date').side
I am starting to think this doesn't make sense because there may not be an instance of an Argument. Is this a place I would use a class method? I thought about making a util class, but I'm thinking that it makes sense to be associated with the Argument class.
Upvotes: 1
Views: 225
Reputation: 16085
This should be a method on a custom model manager:
# in models.py
class ArgumentManager(models.manager.Manager):
def get_current_side(self, user):
try:
return self.filter(user=user).latest('pub_date').side
except Argument.DoesNotExist:
return None
class Argument(models.Model):
# fields etc...
objects = ArgumentManager()
# Calling:
side = Argument.objects.get_current_side(user)
Alternaticely you can extend contrib.auth.user
and add get_current_size()
on it. But I wouldn't mess with it until I'm very confident with Django.
BTW: Most of the code in this page is wrong; for example user
variable is not used at all on the OP's snipplet.
Upvotes: 1
Reputation: 31512
It would make more sense to have instance methods on the User
model:
def get_current_side(self):
try:
return self.arguments.latest('pub_date').side
except User.DoesNotExist, e:
return None
You can do this by extending the User
model as explained here:
Edit: I'm not exactly sure which exception gets thrown.
Upvotes: 2
Reputation: 179
I think what you are looking for are model managers.
Django docs on managers with managers you can add a function to the model class instead of a model instance.
Upvotes: 0