我有以下Django模型
class OfflineExamResult(models.Model):
""" Model to store result of offline exam """
batch = models.CharField(max_length=40, null=True, blank=True)
date = models.CharField(max_length=20, null=True, blank=True)
full_marks = models.IntegerField(default=80)
rank = models.CharField(max_length=5, null=True, blank=True)
uid1 = models.CharField(max_length=10, null=True, blank=True)
uid2 = models.CharField(max_length=10, null=True, blank=True)
name = models.CharField(max_length=30, null=True, blank=True)
marks = models.CharField(max_length=5, null=True, blank=True)
我班的学生们分配了一个工作卷编号,即uid1和uid2的总和(字符串总和)。我想创建一个搜索字段,以便学生输入自己的卷号并获得将要发生的结果,只有当我能够将卷号与uid1和uid2之和进行比较后才能够过滤对象。
答案 0 :(得分:4)
您需要将 F() 与annotation()
一起使用。
from django.db.models import F
students = OfflineExamResult.objects.annotate(roll=F('uid1') + F('uid2')).\
filter(roll=given_roll_number)
答案 1 :(得分:1)
由于您的uid1
和uid2
是 CharFields ,因此,如果要在CharFields之间执行算术运算,则需要使用Cast数据库函数。
这应该有效:
from django.db.models import F, IntegerField
from django.db.models.functions import Cast
students = OfflineExamResult.objects.annotate(uid1_int=Cast('uid1', IntegerField()), uid2_int=Cast('uid2', IntegerField())).annotate(roll=F('uid1_int') + F('uid2_int')).filter(roll=roll_number)
P.S。
在示例中,我使用了IntegerField
字段,但是如果数据库中有十进制数字,则应改用FloatField
。