Выяснить, назначен ли объект модели последним экземпляром другой модели
Работаю над кейсом по управлению комиссиями на 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=}")