Фоновый процесс в Django

Я новичок в Django и у меня проблема с пониманием фоновых процессов реализации. Например, у меня есть:

model.py

class Person(models.Model):
name = models.CharField(max_length=23)
math_grade = models.IntegerField(null=True, blank=True)
phys_grade = models.IntegerField(null=True, blank=True)
avg_grade = models.IntegerField(null=True, blank=True)

class PersonAdmin(admin.ModelAdmin):
    list_display=('name', 'math_grade ','phys_grade', 'avg_grade')

admin.py

from django.contrib import admin
from .models import *

admin.site.register(Person, PersonAdmin)

Как реализовать следующее: Автоматически проверять (периодически), сохранены ли math_grade и phys_grade в DB для этого человека, и затем автоматически, например, сохранять avg_grade как (a+b)/2

Вам не нужно периодически запускать код для этого. Вам нужно просто обновить avg_grade когда у вас есть оба числа. поэтому просто вычислите avg_grade когда у вас есть оба числа через запрос (иначе как вы обновите метки). Следующий код должен помочь вам в дальнейшей обработке.

from django.http import HttpResponse
from django.views import View

class UpdateAvgGrade(View):
    def post(self, request):
       data = request.data
       math_marks = data.get('math_marks')
       phy_marks = data.get('phy_marks')
       name_of_person = data.get('name') # as your Person model don't have a User. So using Name to fetch exact user.

       person = Person.objects.get(name=name_of_person)

       if person.math_marks == None:
          # if there are no math_marks present then save math_marks to math_marks from request.
          person.math_marks = math_marks
          person.save()

      if person.phy_marks == None:
         # same thing as math_marks for phy_marks.
         person.phy_marks = phy_marks
         person.save()

      math_marks = person.math_marks # updading this in case you get only value from request and other is present already in DB.
      phy_marks = person.phy_marks

      # now calculate the average grade.
       if person.avg_grade == None:

          # check if you are getting both math and phy marks from request.
          # is yes then you can find the average grade.
          if math_marks and phy_marks:
             avg_grade = (math_marks + phy_marks) // 2 # becase it is int field.
         else:
            return HttpResponse({
               'msg': 'Please provide both math and phy marks.'
            })
      else:
         return HttpResponse({
            'msg': 'avg_grade already present and not udpated.'
         })

Вернуться на верх