Продвинутые фильтры django

Я работаю над системой управления. Где у меня есть модели:

class FeeType(models.Model):
    name = models.CharField("fee Type", max_length=200)
    duedate = models.DateField("due date")

    class Meta:
        verbose_name_plural = "Fee Type"

    def __str__(self):
        return self.name

class CollectFee(models.Model):
    boarder = models.ForeignKey(Boarder, on_delete=models.CASCADE)
    feetype = models.ForeignKey(FeeType, on_delete=models.CASCADE)
    amountpaid = models.PositiveIntegerField("amount Paid")

    class Meta:
        verbose_name_plural = "Collect Fee"

    def __str__(self):
        return self.boarder.name

Теперь в шаблоне я хочу показать список всех пансионеров/студентов, которым не была назначена последняя плата. Например, если "July Fee" является последним объектом в модели FeeType, то показать всех тех пансионеров, которым не была назначена плата за июль.

Я пробовал использовать представление для этого:

def feedue(request):
    last_fee_type = FeeType.objects.last()

    boarders = CollectFee.objects.exclude(boarder__collectfee__feetype=last_fee_type)

    context = {'boarders':boarders}
    return render(request, 'fee-due.html', context)

Он не показывает бордеров, которым был присвоен последний тип, это верно. Но если бордеру не присвоен последний тип, то он показывает имя бордера столько раз, сколько ему было присвоено предыдущих типов. Надеюсь, вы поняли. Помогите пожалуйста.

Вы должны запрашивать Boarder, если вам нужен список бордеров. Вы можете фильтровать по обратному отношению внешнего ключа (по умолчанию collectfee_set__whatever)

Если вы используете Postgres, вы можете добавить .distinct('boarder'). Я не знаю, что обычный .distinct() будет делать с другой БД

Вернуться на верх