При попытке получить значение поля модели я получаю объект DeferredAttribute Django

#python #django #django-models

#python #django #django-модели

Вопрос:

Привет, итак, в основном у меня есть модель профиля, которая отслеживает точки. И я группирую эти профили в группы как студентов. Итак, в основном в группах у меня есть метод, проходящий через всех учащихся в группе и возвращающий список точек, но он предназначен для sum() , (поскольку я получаю ошибку, я попытался список для отладки). Как мне получить фактическое значение вместо объекта? Это код:

 class profil(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    points = models.SmallIntegerField(default=0)

    def __str__(self):
        return self.user.username

    def addPoints(self, amount):
        self.points  = amount

    def subtractPoints(self, amount):
        self.points -= amount

    def changePoints(self, amount):
        self.points  = amount

class skupine(models.Model):
    choices = (
        ('#52A2D9', 'Modra'),
        ('#8ec641', 'Zelena'),
        ('#f3c12f', 'Rumena'),
        ('#e2884c', 'Oranžna'),
        ('#f37358', 'Rdeča'),
        ('#b460a5', 'Vijolična')
    )

    teacher = models.ForeignKey(User, on_delete=models.CASCADE, related_name='teacherToSkupina')
    title = models.CharField(max_length=30)
    desciption = models.CharField(max_length=120, null=True)
    color = models.CharField(max_length=7, choices=choices)
    students = models.ManyToManyField(profil, related_name='studentsToSkupina')

    def __str__(self):
        return self.title

    def get_total_points(self):
        return list(profil.points for items in self.students.all())
                        
    class Meta:
        verbose_name_plural = "skupine"
 

Что я получаю при вызове метода :

 >>> s.get_total_points()
[<django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>, <django.db.models.query_utils.DeferredAttribute object at 0x03D957D0>]
 

Чего я хочу:

 [4,5,2,3,6,1,3]
 

Ответ №1:

Я предполагаю, что s это экземпляр skupine class . В этом случае, если вам нужен список точек из связанных profil объектов, вам следует выполнить следующее:

 def get_total_points(self):
    return [student.points for student in self.students.all()]
 

и, если вам нужна сумма баллов, используйте встроенную функцию sum:

 def get_total_points(self):
    return sum(student.points for student in self.students.all())
 

Комментарии:

1. Спасибо за ваш комментарий. Я видел, что я не выразил суть вопроса. Мне нужно получить фактические значения полей вместо местоположения объекта.