Фильтрация данных по сумме двух полей - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующая модель 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 голосов
/ 04 июля 2018

Поскольку ваши uid1 и uid2 равны CharFields , вам необходимо использовать функцию базы данных Cast , если вы хотите выполнять арифметические операции среди CharFields.

Это должно работать:

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)

приписка

Я использовал поле IntegerField в моем примере, но если у вас есть десятичные числа в базе данных, вы должны использовать FloatField.

0 голосов
/ 04 июля 2018

Вам нужно использовать F () с annotation().

from django.db.models import F

students = OfflineExamResult.objects.annotate(roll=F('uid1') + F('uid2')).\
filter(roll=given_roll_number)
...