【发布时间】:2019-05-28 19:56:29
【问题描述】:
models.py:
class Student(models.Model):
total_fees = models.PositiveIntegerField(blank=False)
roll_number = models.PositiveIntegerField(blank=False)
class StudentTransaction(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE, blank=False)
amount = models.PositiveIntegerField(blank=False)
timestamp = models.DateTimeField(auto_now_add=True, blank=True)
admin.py:
class StudentTransactionModelAdmin(admin.ModelAdmin):
list_display = ['__str__', 'time', 'amount']
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'student':
x = StudentTransaction.objects.order_by().annotate(Sum('amount')).filter(amount__sum__lt=student__total_fees)
kwargs["queryset"] = [i.student for i in x]
return super().formfield_for_foreignkey(db_field, request, **kwargs)
在执行annotate 时,我想在函数formfield_for_foreignkey 中汇总每个学生的所有交易金额。我想要实际的Student 对象,所以这不能使用values 来完成。
为了简单起见,假设有 3 个Student 对象。其中一个进行了 2 次交易,另一个进行了 4 次交易,第三个没有进行任何交易。每个学生的交易金额总和不超过学生的total_fees。 formfield_for_foreignkey 应该返回所有尚未支付费用的Student 对象。条件是:
sum(<all transactions of each student>) is less than <total_fees of that student>
注意:为了使代码尽可能简短,我们特意删除了一些细节。如果缺少某些内容或会产生错误,请务必报告。
【问题讨论】:
标签: django foreign-keys django-admin django-queryset