代码之家  ›  专栏  ›  技术社区  ›  fmakawa

Django保存在一个模型实例中输入到另一个模型的数据

  •  0
  • fmakawa  · 技术社区  · 7 年前

    我有一个叫模型的老师,他教的课程有“评级”属性。每堂课结束后,班上的每个学生都可以评论和回顾他的表现。它们通过创建一个新的发生对象实例来实现。如何将发生实例中的每个新“评分”保存到教师实例的“评分”中,并确保平均值正确。我已经能够通过获取每个老师的所有偶发事件对象来显示每个老师的平均值,并获得平均值,但我还不能保存该值。我该怎么做?

    模特儿

    教师模型

    class ProfileTeacher(models.Model):
        created = models.DateTimeField(auto_now=False, auto_now_add=True, blank = False, null = False, verbose_name = 'Creation Date')
        user = models.OneToOneField(app_settings.USER_MODEL,blank=True, null=False)
        first_name = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'First Name')
        last_name = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'Surname')
        phone_number = models.CharField(max_length = 15, null=True, blank = True, verbose_name = 'Phone Number')
        city = models.ForeignKey(City, null=True, blank = True, verbose_name = 'City')
        postal_code = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'Postal Code')
        adress = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'Address')
        nationality = CountryField(blank_label='(select country)', null=True, blank = True)
        id_number = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'ID Number(NIF/NIE)')
        bank_account = IBANField(verbose_name='IBAN', blank = True, null=True)
        date_of_birth = models.DateField(auto_now=False, auto_now_add=False, blank = True, null = True, verbose_name='Date of birth')
        #To enable them showing up in search. Only active teachers are shown and preapproved needs to be true to be active
        preapproved = models.BooleanField(default=False, blank=True, verbose_name='Pre-Approved')
        active = models.BooleanField(default=False, blank=True, verbose_name='Active')
        #Braintree and Milingual Terms of Service Acceptance
        tos = models.BooleanField(default=False, blank=True)
        #If true will receive classes email notifications
        email_notification = models.BooleanField(default=False, blank=True, verbose_name="Recibir Notificaciones")
        GENDER = (
           ('male','Male'),
           ('female','Female'),
        )
        gender = models.CharField(max_length=20, choices=GENDER, blank = True, null=True, verbose_name = 'Gender' )
        language = models.ForeignKey(Language, null = True, blank=True)
        teacher_type = models.ForeignKey(TeacherType, null = True, blank=True, verbose_name='Type')
        cvv = models.FileField(upload_to=teacher_cv_directory_path, null=True, blank = True, verbose_name="CV")
        profile_image = models.ImageField(upload_to=teacher_avatar_directory_path,
                                          null = True,
                                          blank=True,
                                          default='/perfil.png',
                                          )
    
    
        RATINGS = (
            (1, '1'),
            (2, '2'),
            (3, '3'),
            (4, '4'),
            (5, '5'),
        )
        rating = models.DecimalField(max_digits=3, decimal_places=2,default=0, choices=RATINGS, blank=True, verbose_name="RATINGS", null=False)
        #True if the profile will appear on milingual site as Public
        published = models.BooleanField(null=False, blank=False, default=True)
        #Url: Teacher's Url
        url = models.SlugField(max_length=400, null=True, blank = True, verbose_name='Url')
        # True if teacher is legacy
        legacy = models.BooleanField(default=False, blank=True)
        legacy_id = models.IntegerField(default=0, null=True, blank=True)
    
        class Meta:
            verbose_name_plural = 'Teachers'
            verbose_name = 'Teacher'
    
        @property
        def absolute_rating(self):
            return int(float(self.rating)/5 * 100)
    
        def save(self, *args, **kwargs):
            # Check how the current values differ from ._loaded_values. For example,
            # prevent changing the creator_id of the model. (This example doesn't
            # support cases where 'creator_id' is deferred).
            #Building_unique_url
            url =  str(self.first_name).lower() + '_' + str(self.last_name).lower() + '_' + str(int(self.user.id))
            self.url = url
            if self.rating == '':
                self.rating = 0
    
            if self.profile_image!='/perfil.png'and self.cvv!='':
                self.preapproved = True
            else: 
                self.preapproved = False
    
            try:
                this = ProfileTeacher.objects.get(id=self.id)
                if this.profile_image != self.profile_image:
                    this.profile_image.delete(save=False)
            except: pass # when new photo then we do nothing, normal case
    
            super(ProfileTeacher, self).save(*args, **kwargs)
    
        def __unicode__(self):
            return "%s %s" % (self.first_name, self.last_name)
    

    类发生模型

    class OccurrenceRating(models.Model):
        # Update
        updated = models.DateTimeField(auto_now=True, auto_now_add=False, blank = False, null = False, verbose_name = 'Updated')
        # Created
        created = models.DateTimeField(auto_now=False, auto_now_add=True, blank = False, null = False, verbose_name = 'Creation Date')
        # Author
        student = models.ForeignKey(ProfileStudent, verbose_name = 'Student')
        # Rating Value: 1 - 5
        CHOICHES =(
            (1, '1'),
            (2, '2'),
            (3, '3'),
            (4, '4'),
            (5, '5'),
        )
        occurrence = models.ForeignKey(Occurrence, verbose_name = 'Class')
        # Teacher Rating
        tc_rating = models.IntegerField(choices=CHOICHES, null=True, blank = True, verbose_name = 'Evaluación Profesor')
        # Feedback to teacher
        tc_comment = models.TextField(max_length = 5000, null=True, blank = False, verbose_name = 'Comentario al profesor')
        # Feedback to teacher
        vn_rating = models.IntegerField(choices=CHOICHES, null=True, blank = True, verbose_name = 'Evaluación Local')
        # Occurrence comment
        vn_comment = models.TextField(max_length = 5000, null=True, blank = False, verbose_name = 'Comentario al Local')
        # Occurrence Rated
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Sachin    7 年前

    Teacher

    # req_query_teacher_id - I am assuming it is from the query params in request
    teacher = Teacher.objects.get(id=req_query_teacher_id)
    
    oc = OccurrenceRating.objects.create(...)
    
    # get average rating for this teacher
    avg_rating = get_avg_rating(teacher)
    teacher.rating = avg_rating
    teacher.save()