跨两个模型的Django简单注释

我有三种模型,用户,成就和用户成就:

class User(AbstractUser):
    email = models.EmailField(_('email address'),unique=True)
    ...

class Achievement(models.Model):
    name = models.CharField(max_length=64)
    points = models.PositiveIntegerField(default=1)

class UserAchievement(models.Model):
    # Use a lazy reference to avoid circular import issues
    user = models.ForeignKey('users.User',on_delete=models.CASCADE)
    achievement = models.ForeignKey(Achievement,on_delete=models.CASCADE)

我想用“点数”列注释用户,该列总结了UserAchievement表中列出的所有成就所获得的总点数。

但是很明显,我并没有完全了解注释的工作方式。当我尝试时:

users = User.objects.annotate(points=Sum('userachievement__achievement__points'))
for u in users:
   print(u.email,u.points)

它崩溃与:

Traceback (most recent call last):
  File "<console>",line 1,in <module>
  File "/Users/dylan/.local/share/virtualenvs/server-E23dvZwD/lib/python3.7/site-packages/django/db/models/query.py",line 274,in __iter__
self._fetch_all()
  File "/Users/dylan/.local/share/virtualenvs/server-E23dvZwD/lib/python3.7/site-packages/django/db/models/query.py",line 1242,in _fetch_all
self._result_cache = list(self._iterable_class(self))
  File "/Users/dylan/.local/share/virtualenvs/server-E23dvZwD/lib/python3.7/site-packages/django/db/models/query.py",line 78,in __iter__
setattr(obj,attr_name,row[col_pos])
AttributeError: can't set attribute
zhang0013hao 回答:跨两个模型的Django简单注释

您可以使用User作为通过表的AchievementUserAchievement之间的ManyToManyField,以简化查询

class User(AbstractUser):
    email = models.EmailField(_('email address'),unique=True)
    achievements = models.ManyToManyField('Achievement',through='UserAchievement')
    ...

这可以用于注释

User.objects.annotate(points=Sum('achievements__points'))

如果您有一个用户实例

user.achievements.all()

对于错误,我相信您在用户模型上有一个名为points的属性

本文链接:https://www.f2er.com/3148358.html

大家都在问