Выяснить, назначен ли объект модели последним экземпляром другой модели

Работаю над кейсом по управлению комиссиями на Django. Код приведен ниже:

class Student(models.Model):
    name = models.CharField("name",max_length=200)
    cell_no = models.CharField("cell No",max_length=200)
    address = models.CharField("address",max_length=500)

    class Meta:
        verbose_name_plural = "Student"

    def __str__(self):
        return self.name

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

    class Meta:
        verbose_name_plural = "Fee Type"

    def __str__(self):
        return self.name

class CollectFee(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    feetype = models.ForeignKey(FeeType, on_delete=models.CASCADE)
    amountdue = models.PositiveIntegerField("amount Due")
    amountpaid = models.PositiveIntegerField("amount Paid")
    balance = models.PositiveIntegerField("Balance")

    class Meta:
        verbose_name_plural = "Collect Fee"

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

Тип платы - это вступительный взнос, плата за январь, плата за февраль и т.д.

Я хочу получить список всех студентов, которым еще не был назначен последний экземпляр FeeType. Например, если в CollectFee студенту назначена плата за январь, февраль месяц, то Ok, если студенту не назначена плата за март, он должен быть включен в список.

Я мог бы получить список всех студентов: students= Student.objects.all() Я могу работать с простыми фильтрами, но не знаю, как применить фильтр для решения вышеупомянутой проблемы.

В вашем FeeType нет порядка, как его отсортировать? Давайте добавим поле "order", хотя мне и не нравится использовать слово, зарезервированное в SQL. Ваша модель CollectFee представляет собой "соединение" между Student и FeeType. Вы можете использовать ManyToMany, чтобы упростить себе жизнь. Не забывайте, когда вы пишете на Python, разделять слова с помощью _ (= не feetype, а fee_type).

Итак, код ( не тестировался, но должен работать):

class Student(models.Model):
    name = models.CharField("name",max_length=200)
    collected_fees = models.ManyToMany("FeeType", through="CollectFee")

class FeeType(models.Model):
    order = models.IntegerField(required=True) 
    name = models.CharField("fee Type", max_length=200)

class CollectFee(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    fee_type = models.ForeignKey(FeeType, on_delete=models.CASCADE)
    amount_due = models.PositiveIntegerField("amount Due")
    amount_paid = models.PositiveIntegerField("amount Paid")

И некоторые запросы ( не тестировались, но должны работать)


Получение студента, всех его сборов и печать всех сборов, которые ему еще не назначены:

olivier = Student.get(name="Olivier")
for fee in olivier.collected_fees.all():
    print("{fee=}, {fee.amount_due=}, {amount_paid=}")
for fee in FeeType.all().exclude(
    id__in=[f.pk for f in olivier.collected_fees.all()]
):
    print("fee not assigned to {olivier=}: {fee=}")

Получение последнего взноса (с использованием поля order):

last_fee = FeeType.all().order_by("order")[-1]
# get all students who doesn't belong to the group of
# "all students who have been assigned the last instance of the FeeType"
for student in Student.all().exclude(pk__in=[
    c_f.student.pk for c_f in CollectFee.filter(
        fee_type=last_fee
    )
]):
    print("Not assigned: {student=}")
Вернуться на верх