[英]any I'm trying to update a booleanfield from another model. i have 2 model studentcourse and Examgrade 'RelatedManager' object has no attribute 'show'
I have 2 models which are StudentCourses and ExamGrade, below are the models and attribute important which i would like to update on StudentCourses when ExamGrade is created我有 2 个模型,分别是 StudentCourses 和 ExamGrade,下面是重要的模型和属性,我想在创建 ExamGrade 时更新 StudentCourses
models.py模型.py
class StudentCourses(models.Model):
id = models.AutoField(primary_key=True)
student = models.ForeignKey(Students, related_name='studentcourses')
studentcourse = models.ForeignKey(Courses, related_name='studentcourses', null=True)
show = models.BooleanField(default=False)
class ExamGrade(models.Model):
id = models.AutoField(primary_key=True)
lecturer = models.ForeignKey(Lecturers, null=True, related_name='examgrades')
student = models.ForeignKey(StudentCourses, related_name='examgrades')
class Students(models.Model):
id = models.AutoField(primary_key=True)
admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name="students")
profile_pic = models.ImageField(default='default.jpg', upload_to='uploads/student')
middle_name = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
status = models.CharField(max_length=255, null=True)
country = models.CharField(max_length=255, default=None, null=True, blank=True)
state = models.CharField(max_length=255, default=None, null=True, blank=True)
local = models.CharField(max_length=255, default=None, null=True, blank=True)
school = models.ForeignKey(School, null=True, on_delete=models.CASCADE)
dob = models.CharField(max_length=100, default=None, blank=True, null=True)
guardian_name = models.CharField(max_length=11, null=True)
mobile = models.CharField(max_length=12, null=True, default=None)
faculty = models.ForeignKey(Faculty, null=True, blank=True, on_delete=models.CASCADE)
department = models.ForeignKey(Department, null=True, blank=True, on_delete=models.CASCADE)
level = models.ForeignKey(Level, null=True, blank=True, on_delete=models.CASCADE)
semester = models.ForeignKey('Semester', null=True, blank=True, on_delete=models.CASCADE)
session = models.ForeignKey(SessionYearModel, null=True, blank=True, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
@property
def examgrades(self):
return self.examgrades_set.all().order_by('student')
@property
def studentcourses(self):
return self.studentcourses_set.all().order_by('studentcourse')
from the model above the student are related to both StudentCourse and ExamGrade i would like to update the show attribute to True on StudentCourses and in my views i have this code below从上面的 model 中,学生与 StudentCourse 和 ExamGrade 有关,我想在 StudentCourses 上将 show 属性更新为 True,在我看来,我在下面有这段代码
Views.py视图.py
class CreateGradeView(View):
def get(self, request, *args, **kwargs):
lecturer= Lecturers.objects.get(admin=request.user)
course = LecturerCourse.objects.filter(lecturer=lecturer)
context = {
'course':course,
'room_name': "broadcast"
}
return render(request, 'superadmin/lecturer/add-grade.html',context)
def post(self, request, *args, **kwargs):
lecturer = request.POST.get('lecturer')
lecturer = Lecturers.objects.get(admin=lecturer)
student = request.POST.get('student')
student = StudentCourses.objects.get(id=student)
course = request.POST.get('lecturercourse')
course = LecturerCourse.objects.get(id=course)
ca_1 = request.POST.get('ca_1')
ca_2 = request.POST.get('ca_2')
ca_3 = request.POST.get('ca_3')
exam = request.POST.get('exam')
if ExamGrade.objects.filter(lecturer=lecturer, student=student, lecturercourse=course, status=True).exists():
messages.warning(request, "User Exam Score already marked")
return redirect('emisapp:add-grade')
try:
examgrades = ExamGrade(lecturer=lecturer, student=student, lecturercourse=course, ca_1=ca_1,ca_2=ca_2,ca_3=ca_3,exam=exam, status=True)
print(examgrades.student.show)
examgrades.student.show = True
print(examgrades.student.show)
examgrades.save()
messages.success(request, 'Weldone you just saved Exam Score for the day')
return redirect('emisapp:add-grade')
except:
messages.error(request, 'There is an saving to database')
return redirect('emisapp:add-grade')
ajax.py ajax.py
def load_student_for_attendance_by_courses(request):
studentcourse = request.GET.get('studentcourse')
student = StudentCourses.objects.filter(studentcourse=studentcourse,
show=False).order_by('student')
return render(request, 'superadmin/settings/load-student-
dropdown.html', {'student':student})
load-student-dropdown.html加载学生下拉.html
<option value="">--Select a Student--</option>
{% for s in student %}
<option value="{{s.id}}">{{ s.student.admin.username }} - {{ s.student.admin.last_name }} {{ s.student.middle_name }} {{ s.student.admin.first_name }}</option>
{% endfor %} {% endfor %}
and this was my error 'RelatedManager' object has no attribute 'show' .这是我的错误'RelatedManager' object has no attribute 'show' 。
Now you can simply do this:现在你可以简单地这样做:
from django.shortcuts import get_object_or_404
try:
examgrades = ExamGrade(lecturer=lecturer, student=student, lecturercourse=course,
ca_1=ca_1, ca_2=ca_2, ca_3=ca_3, exam=exam, status=True)
print(examgrades.student.show)
stu_courses_instance = get_object_or_404(
StudentCourses, id=examgrades.student.id)
stu_courses_instance.show = True
stu_courses_instance.save()
print(examgrades.student.show)
examgrades.save()
messages.success(request, 'Weldone you just saved Exam Score for the day')
return redirect('emisapp:add-grade')
Note: Generally, Django models are written in
PascalCase
and don't requires
to be the suffix as it is added by default by Django, so it is better to name the models asStudentCourse
, 'Studentand 'Lecturer
not,StudentCourses
andStudents
respectively.Lecturers
注意:一般Django模型都是
PascalCase
写的,不需要s
作为后缀,因为Django默认加了,所以最好将模型命名为StudentCourse
,'Studentand 'Lecturer
,而不是,StudentCourses
andStudents
分别。Lecturers
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.