根据两个字段的和过滤数据

时间:2018-07-04 06:06:24

标签: python django django-models django-queryset

我有以下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之和进行比较后才能够过滤对象。

2 个答案:

答案 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)

由于您的uid1uid2 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