首页 > 解决方案 > Django - model.py 中的 forloop 分配外键

问题描述

我有两个模型 - 用户和排名。在 def save() 期间,我希望根据用户拥有的点数和 Rank 模型中的 min_points 自动将用户排名分配给一个排名。

楷模

class User(AbstractUser):
    points = models.IntegerField(default=0)
    rank = models.ForeignKey(Rank, on_delete=models.SET_NULL, null=True, blank=True)


class Rank(models.Model):
    rank = models.CharField(max_length=200)
    min_points = models.IntegerField()

现在我在用户模型中添加了 save() 函数来检查用户点并与正确的排名进行比较

# ...user model
def save(self, *args, **kwargs):
    for i in Rank.objects.all():
        if self.points >= i.min_points:
            self.rank == Rank.objects.get(id=i.id)
    super().save(*args, **kwargs)

不幸的是,保存或创建新用户后什么都没有发生。

我的 IDE 抛出警告: 类 'Rank' 的未解析属性引用 'objects'

我错过了什么吗?我想不通这个问题...

标签: pythondjangodjango-modelsforeign-keys

解决方案


无需枚举Rank对象。我们可以检索Rank最大数量min_points小于或等于self.pointswith 的 :

def save(self, *args, **kwargs):
    self.rank = Rank.objects.filter(
        min_points__lte=self.points
    ).latest('min_points')
    return super().save(*args, **kwargs)

推荐阅读