Search code examples
pythondjangofilterselfdetailview

Additional queryset in DetailView (using self)


I am creating application to manage home budget. I've got a few models - Date, Expense, Category, Income.

It looks like this

class Date(models.Model):
    name = models.CharField(max_length = 15)    
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='date')

class Category(models.Model):
    name = models.CharField(max_length=100)
    budget = models.DecimalField(max_digits=8, decimal_places=2)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='category')
    date = models.ForeignKey(Date, on_delete=models.CASCADE, related_name='date', default='Styczeń 2022')

class Expense(models.Model):
    name = models.CharField(max_length=100)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    account = models.ForeignKey(Account, on_delete=models.CASCADE, related_name="account")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='expense')
    date = models.ForeignKey(Date, on_delete=models.CASCADE, default='Styczeń 2022')

class Income(models.Model):
    name = models.CharField(max_length=100)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    account = models.ForeignKey(Account, on_delete=models.CASCADE, related_name="account_income")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='income')

First of all user should choose a "Date", next it goes to DateDetailView. And on this DetailView I want to display Expense only for this Date. I tried with objects.filter, but I don't know how I should write it properly.

I wrote something like this

class DateDetailView(DetailView):
    model = Date
    template_name = 'expense/date_detail.html'
    context_object_name = 'date'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['expense'] = Expense.objects.filter(date=F('pk'))
        return context

I also tried this

class DateDetailView(DetailView):
    model = Date
    template_name = 'expense/date_detail.html'
    context_object_name = 'date'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['expense'] = Expense.objects.filter(date=self.date)
        return context

Have you got any ideas? Thanks!


Solution

  • Okey, I found a solution.

    class DateDetailView(DetailView):
        model = Date
        template_name = 'expense/date_detail.html'
        context_object_name = 'date'
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['expense'] = Expense.objects.filter(date=self.object)
            return context