【问题标题】:Django - forloop in model.py to assign foreignkeyDjango - model.py 中的 forloop 分配外键
【发布时间】:2021-10-28 05:59:45
【问题描述】:

我有两个模型 - 用户和排名。在 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”

我错过了什么吗?我无法弄清楚问题...

【问题讨论】:

  • self.rank == Rank.objects.get(id=i.id) 不会做任何事情,因为这仅意味着您检查相等性,并且无论您做什么,它都不会对该信息做任何事情。
  • @WillemVanOnsem 好的,我该如何设置 self.rank 外键?
  • self.rank = ...,但你不应该一开始就枚举。您可以通过单个查询来解决此问题。

标签: python django django-models foreign-keys


【解决方案1】:

无需枚举Rank 对象。我们可以通过以下方式检索min_points 的最大数量小于或等于self.pointsRank

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

【讨论】:

猜你喜欢
  • 2019-06-02
  • 2015-08-30
  • 1970-01-01
  • 2021-04-17
  • 2022-01-17
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多