Search code examples
pythondjango-modelsdjango-rest-frameworkdjango-querysetdjango-managers

Returning queryset of all a user's debts?


I have a django rest api which an android client is connected to. One of the models on the django rest framework api is called Debt:

class Debt(models.Model):
    paying_user = models.ForeignKey(User, related_name="paying_user")
    receiving_user = models.ForeignKey(User, related_name="reeceiving_user")
    amount = models.FloatField()
    currency = models.CharField(max_length=10, default="USD")
    description = models.CharField(max_length=100, blank=True)
    date_incurred = models.DateTimeField(default=timezone.now)
    deadline = models.DateTimeField()
    payed = models.BooleanField(default=False)
    overdue = models.BooleanField(default=False)

    class Meta:
        verbose_name = "Debt"
        verbose_name_plural = "Debts"

    objects = DebtManager()

    def save(self, *args, **kwargs):
        if self.paying_user == self.receiving_user:
            raise ValidationError("Users cannot be in debt with themselves.")
        super(Debt, self).save(*args, **kwargs)

In the DebtManager I have a function named all_debt:

def all_debts(self, user):
    ''' Returns a queryset of all a user's debts '''
    all_debt_queryset = ... # What do I write here?
    return all_debt_queryset

To retrieve all a user's debts, I would need to get all Debt objects where the paying_user attribute equals the user parameter (current user) and all Debt objects where the receiving_user attribute equals the user parameter.

How do I get a queryset with all a user's debts?


Solution

  • You can use filter and simply return the queryset. I am assuming that you are sending the user object in the method argument.

    from django.db.models import Q
    def all_debts(self, user):
        return self.objects.filter(Q(paying_user=user) | Q(receiving_user=user))
    

    Note: I would suggest remove all_debts function from DebtManager. It is not suited to be a manager's function. Although its better suited for Debt model's function